From 1c02f5b648cd3c58a7db7dcec761071d5daabb26 Mon Sep 17 00:00:00 2001
From: ZY <zc857179121@qq.com>
Date: 星期二, 20 八月 2024 13:24:20 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/wms-dev' into wms-dev

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocMapMapper.java                |   12 
 zy-asrs-admin/src/views/loc/loc/index.vue                                              |    1 
 zy-asrs-admin/src/views/system/language/edit.vue                                       |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/Utils.java                             |   39 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java                       |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocMapService.java              |    8 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/result/LoginResult.java    |   26 
 zy-asrs-admin/package-lock.json                                                        | 1217 ++++++++++++++++++++
 zy-asrs-admin/src/views/loc/locMap/index.vue                                           |   54 
 zy-asrs-admin/src/views/base/locTypeBind/edit.vue                                      |    4 
 zy-asrs-wms/src/main/resources/mapper/asrs/LocMapMapper.xml                            |    5 
 zy-asrs-admin/src/views/loc/locMap/edit.vue                                            |  128 ++
 zy-asrs-admin/src/views/loc/locMap/locMap.vue                                          |  250 ++++
 zy-asrs-admin/src/views/base/locTypeBind/init.vue                                      |  137 ++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocMapServiceImpl.java     |   12 
 zy-asrs-admin/package.json                                                             |    3 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java       |   15 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CircleRuleServiceImpl.java |   10 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocTypeBindController.java   |   35 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/InitLocTypeBindParam.java  |   43 
 zy-asrs-admin/src/components/locDetl/show.vue                                          |    6 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/enums/ShelvesRuleDetlType.java   |   19 
 license.lic                                                                            |    0 
 zy-asrs-admin/src/components/loc/map/index.vue                                         |  772 +++++++++++++
 zy-asrs-admin/src/views/base/locTypeBind/index.vue                                     |    9 
 zy-asrs-wms/src/main/resources/license.lic                                             |    0 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java                     |   21 
 zy-asrs-admin/src/config.js                                                            |   31 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/LocUtils.java                          |   45 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocMapController.java        |  182 +++
 zy-asrs-wms/src/main/resources/sql/menu/locMap.sql                                     |    9 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocMap.java                      |  203 +++
 zy-asrs-admin/src/App.vue                                                              |   30 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java       |  170 ++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Loc.java                         |   10 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LanewayRule.java                 |   17 
 36 files changed, 3,442 insertions(+), 89 deletions(-)

diff --git a/license.lic b/license.lic
index b80345a..cb51cd3 100644
--- a/license.lic
+++ b/license.lic
Binary files differ
diff --git a/zy-asrs-admin/package-lock.json b/zy-asrs-admin/package-lock.json
index 52b0401..a3d8b08 100644
--- a/zy-asrs-admin/package-lock.json
+++ b/zy-asrs-admin/package-lock.json
@@ -13,6 +13,7 @@
         "ant-design-vue": "^4.2.3",
         "axios": "^1.7.2",
         "pinia": "^2.1.7",
+        "pixi.js": "^5.3.12",
         "vue": "^3.4.29",
         "vue-router": "^4.3.3",
         "vue3-print-nb": "^0.1.4"
@@ -886,6 +887,353 @@
         "@jridgewell/sourcemap-codec": "^1.4.14"
       }
     },
+    "node_modules/@pixi/accessibility": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/accessibility/-/accessibility-5.3.12.tgz",
+      "integrity": "sha512-JnfII2VsIeIpvyn1VMNDlhhq5BzHwwHn8sMRKhS3kFyxn4CdP0E4Ktn3/QK0vmL9sHCeTlto5Ybj3uuoKZwCWg==",
+      "dependencies": {
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/app": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/app/-/app-5.3.12.tgz",
+      "integrity": "sha512-XMpqoO+1BFIVakgHX/VlBaO4qWxg9TitvybDeXZxyVlSCG84DMNulN55jYufVp92nqHhiRr2fAIc9JDccOcNcQ==",
+      "dependencies": {
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/constants": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.12.tgz",
+      "integrity": "sha512-UcuvZZ8cQu+ZC7ufLpKi8NfZX0FncPuxKd0Rf6u6pzO2SmHPq4C1moXYGDnkZjPFAjNYFFHC7chU+zolMtkL/g=="
+    },
+    "node_modules/@pixi/core": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.12.tgz",
+      "integrity": "sha512-SKZPU2mP4UE4trWOTcubGekKwopnotbyR2X8nb68wffBd1GzMoaxyakltfJF2oCV/ivrru/biP4CkW9K6MJ56g==",
+      "dependencies": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/runner": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/ticker": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/pixijs"
+      }
+    },
+    "node_modules/@pixi/display": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.12.tgz",
+      "integrity": "sha512-/fsH/GAxc62rvwTnmrnV8oGCkk4LwJ9pt2Jv3UIorNsjXyL0V5fGw7uZnilF2eSdu6LgQKBMWPOtBF0TNML3lg==",
+      "dependencies": {
+        "@pixi/math": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/extract": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-5.3.12.tgz",
+      "integrity": "sha512-PRs9sKeZT+eYSD8wGUqSjHhIRrfvnLU65IIJYlmgTxYo9U4rwzykt74v09ggMj/GFUpjsILISA5VIXM1TV79PQ==",
+      "dependencies": {
+        "@pixi/core": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/filter-alpha": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/filter-alpha/-/filter-alpha-5.3.12.tgz",
+      "integrity": "sha512-/VG+ojZZwStLfiYVKcX4XsXNiPZpv40ZgiDL6igZOMqUsWn7n7dhIgytmbx6uTUWfxIPlOQH3bJGEyAHVEgzZA==",
+      "dependencies": {
+        "@pixi/core": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/filter-blur": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/filter-blur/-/filter-blur-5.3.12.tgz",
+      "integrity": "sha512-8zuOmztmuXCl1pXQpycKTS8HmXPtkmMe6xM93Q1gT7CRLzyS97H3pQAh4YuaGOrJslOKBNDrGVzLVY95fxjcTQ==",
+      "dependencies": {
+        "@pixi/core": "5.3.12",
+        "@pixi/settings": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/filter-color-matrix": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/filter-color-matrix/-/filter-color-matrix-5.3.12.tgz",
+      "integrity": "sha512-CblKOry/TvFm7L7iangxYtvQgO3a9n5MsmxDUue68DWZa/iI4r/3TSnsvA+Iijr590e9GsWxy3mj9P4HBMOGTA==",
+      "dependencies": {
+        "@pixi/core": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/filter-displacement": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/filter-displacement/-/filter-displacement-5.3.12.tgz",
+      "integrity": "sha512-D/LpJxnGi85wHB6VeBpw0FQAN0mzHHUYNxCADwUhknY+SKfP5RhaYOlk79zqOuakBfQTzL3lPgMNH2EC85EJPw==",
+      "dependencies": {
+        "@pixi/core": "5.3.12",
+        "@pixi/math": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/filter-fxaa": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/filter-fxaa/-/filter-fxaa-5.3.12.tgz",
+      "integrity": "sha512-EI+foorDnYUAy7VF3fzi635u/dyf5EHZOFovGEDrHm/ZTmEJ1i6RolwexCN94vf6HGfaDrIgNmqFcKWtbIvJFA==",
+      "dependencies": {
+        "@pixi/core": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/filter-noise": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/filter-noise/-/filter-noise-5.3.12.tgz",
+      "integrity": "sha512-9KWmlM2zRryY6o0bfNOHAckdCk8X7g9XWZbmEIXZZs7Jr90C1+RhDreqNs8OrMukmNo2cW9hMrshHgJ9aA1ftQ==",
+      "dependencies": {
+        "@pixi/core": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/graphics": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-5.3.12.tgz",
+      "integrity": "sha512-uBmFvq15rX0f459/4F2EnR2UhCgfwMWVJDB1L3OnCqQePE/z3ju4mfWEwOT+I7gGejWlGNE6YLdEMVNw/3zb6w==",
+      "dependencies": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/sprite": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/interaction": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/interaction/-/interaction-5.3.12.tgz",
+      "integrity": "sha512-Ks7vHDfDI58r1TzKHabnQXcXzFbUu2Sb4eQ3/jnzI/xGB5Z8Q0kS7RwJtFOWNZ67HHQdoHFkQIozTUXVXHs3oA==",
+      "dependencies": {
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/ticker": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/loaders": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/loaders/-/loaders-5.3.12.tgz",
+      "integrity": "sha512-M56m1GKpCChFqSic9xrdtQOXFqwYMvGzDXNpsKIsQbkHooaJhUR5UxSPaNiGC4qWv0TO9w8ANouxeX2v6js4eg==",
+      "dependencies": {
+        "@pixi/core": "5.3.12",
+        "@pixi/utils": "5.3.12",
+        "resource-loader": "^3.0.1"
+      }
+    },
+    "node_modules/@pixi/math": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.12.tgz",
+      "integrity": "sha512-VMccUVKSRlLFTGQu6Z450q/W6LVibaFWEo2eSZZfxz+hwjlYiqRPx4heG++4Y6tGskZK7W8l8h+2ixjmo65FCg=="
+    },
+    "node_modules/@pixi/mesh": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-5.3.12.tgz",
+      "integrity": "sha512-8ZiGZsZQBWoP1p8t9bSl/AfERb5l3QlwnY9zYVMDydF/UWfN1gKcYO4lKvaXw/HnLi4ZjE+OHoZVmePss9zzaw==",
+      "dependencies": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/mesh-extras": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-5.3.12.tgz",
+      "integrity": "sha512-tEBEEIh96aSGJ/KObdtlNcSzVfgrl9fBhvdUDOHepSyVG+SkmX4LMqP3DkGl6iUBDiq9FBRFaRgbxEd8G2U7yw==",
+      "dependencies": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/mesh": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/mixin-cache-as-bitmap": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-5.3.12.tgz",
+      "integrity": "sha512-hPiu8jCQJctN3OVJDgh7jqdtRgyB3qH1BWLM742MOZLjYnbOSamnqmI8snG+tba5yj/WfdjKB+8v0WNwEXlH6w==",
+      "dependencies": {
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/sprite": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/mixin-get-child-by-name": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-5.3.12.tgz",
+      "integrity": "sha512-VQv0GMNmfyBfug9pnvN5s/ZMKJ/AXvg+4RULTpwHFtAwlCdZu9IeNb4eviSSAwtOeBAtqk5c0MQSsdOUWOeIkA==",
+      "dependencies": {
+        "@pixi/display": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/mixin-get-global-position": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/mixin-get-global-position/-/mixin-get-global-position-5.3.12.tgz",
+      "integrity": "sha512-qxsfCC9BsKSjBlMH1Su/AVwsrzY8NHfcut5GkVvm2wa9+ypxFwU5fVsmk6+4a9G7af3iqmOlc9YDymAvbi+e8g==",
+      "dependencies": {
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/particles": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/particles/-/particles-5.3.12.tgz",
+      "integrity": "sha512-SV/gOJBFa4jpsEM90f1bz5EuMMiNAz81mu+lhiUxdQQjZ8y/S4TiK7OAiyc+hUtp97JbJ//6u+4ynGwbhV+WDA==",
+      "dependencies": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/polyfill": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/polyfill/-/polyfill-5.3.12.tgz",
+      "integrity": "sha512-qkm8TBIb6m7FmE/Cd/yVagONDlVF5/cWFSSnk4pWA/vt/HLNrXgY9Tx0IXAk6NNK/xc5deGcLPc4iw+DlEhsQw==",
+      "dependencies": {
+        "es6-promise-polyfill": "^1.2.0",
+        "object-assign": "^4.1.1"
+      }
+    },
+    "node_modules/@pixi/prepare": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-5.3.12.tgz",
+      "integrity": "sha512-loZhLzV4riet9MU72WpWIYF6LgbRM78S4soeZOr5SzL1/U5mBneOOmfStaui7dN2GKQKp5GLygDF4dH3FPalnA==",
+      "dependencies": {
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/graphics": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/text": "5.3.12",
+        "@pixi/ticker": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/runner": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.12.tgz",
+      "integrity": "sha512-I5mXx4BiP8Bx5CFIXy3XV3ABYFXbIWaY6FxWsNFkySn0KUhizN7SarPdhFGs//hJuC54EH2FsKKNa98Lfc2nCQ=="
+    },
+    "node_modules/@pixi/settings": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.12.tgz",
+      "integrity": "sha512-tLAa8tpDGllgj88NMUQn2Obn9MFJfHNF/CKs8aBhfeZGU4yL4PZDtlI+tqaB1ITGl3xxyHmJK+qfmv5lJn+zyA==",
+      "dependencies": {
+        "ismobilejs": "^1.1.0"
+      }
+    },
+    "node_modules/@pixi/sprite": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-5.3.12.tgz",
+      "integrity": "sha512-vticet92RFZ3nDZ6/VDwZ7RANO0jzyXOF/5RuJf0yNVJgBoH4cNix520FfsBWE2ormD+z5t1KEmFeW4e35z2kw==",
+      "dependencies": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/sprite-animated": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/sprite-animated/-/sprite-animated-5.3.12.tgz",
+      "integrity": "sha512-WkGdGRfqboXFzMZ/SM6pCVukYmG2E2IlpcFz7aEeWvKL2Icm4YtaCBpHHDU07vvA6fP6JrstlCx1RyTENtOeGA==",
+      "dependencies": {
+        "@pixi/core": "5.3.12",
+        "@pixi/sprite": "5.3.12",
+        "@pixi/ticker": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/sprite-tiling": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-5.3.12.tgz",
+      "integrity": "sha512-5/gtNT46jIo7M69sixqkta1aXVhl4NTwksD9wzqjdZkQG8XPpKmHtXamROY2Fw3R+m+KGgyK8ywAf78tPvxPwg==",
+      "dependencies": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/sprite": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/spritesheet": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/spritesheet/-/spritesheet-5.3.12.tgz",
+      "integrity": "sha512-0t5HKgLx0uWtENtkW0zVpqvmfoxqMcRAYB7Nwk2lkgZMBPCOFtFF/4Kdp9Sam5X0EBMRGkmIelW3fD6pniSvCw==",
+      "dependencies": {
+        "@pixi/core": "5.3.12",
+        "@pixi/loaders": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/text": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/text/-/text-5.3.12.tgz",
+      "integrity": "sha512-tvrDVetwVjq1PVDR6jq4umN/Mv/EPHioEOHhyep63yvFIBFv75mDTg2Ye0CPzkmjqwXXvAY+hHpNwuOXTB40xw==",
+      "dependencies": {
+        "@pixi/core": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/sprite": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/text-bitmap": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/text-bitmap/-/text-bitmap-5.3.12.tgz",
+      "integrity": "sha512-tiorA3XdriJKJtUhMDcKX1umE3hGbaNJ/y0ZLuQ0lCvoTLrN9674HtveutoR9KkXWguDHCSk2cY+y3mNAvjPHA==",
+      "dependencies": {
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/loaders": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/mesh": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/text": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/ticker": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.12.tgz",
+      "integrity": "sha512-YNYUj94XgogipYhPOjbdFBIsy7+U6KmolvK+Av1G88GDac5SDoALb1Nt6s23fd8HIz6b4YnabHOdXGz3zPir1Q==",
+      "dependencies": {
+        "@pixi/settings": "5.3.12"
+      }
+    },
+    "node_modules/@pixi/utils": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.12.tgz",
+      "integrity": "sha512-PU/L852YjVbTy/6fDKQtYji6Vqcwi5FZNIjK6JXKuDPF411QfJK3QBaEqJTrexzHlc9Odr0tYECjwtXkCUR02g==",
+      "dependencies": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "earcut": "^2.1.5",
+        "eventemitter3": "^3.1.0",
+        "url": "^0.11.0"
+      }
+    },
     "node_modules/@rollup/rollup-android-arm-eabi": {
       "version": "4.18.0",
       "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz",
@@ -1392,6 +1740,24 @@
         "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
       }
     },
+    "node_modules/call-bind": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/camelcase": {
       "version": "6.3.0",
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
@@ -1505,6 +1871,22 @@
         }
       }
     },
+    "node_modules/define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -1523,6 +1905,11 @@
       "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz",
       "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w=="
     },
+    "node_modules/earcut": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz",
+      "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="
+    },
     "node_modules/electron-to-chromium": {
       "version": "1.4.812",
       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.812.tgz",
@@ -1538,6 +1925,30 @@
       "funding": {
         "url": "https://github.com/fb55/entities?sponsor=1"
       }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+      "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+      "dependencies": {
+        "get-intrinsic": "^1.2.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es6-promise-polyfill": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz",
+      "integrity": "sha512-HHb0vydCpoclpd0ySPkRXMmBw80MRt1wM4RBJBlXkux97K7gleabZdsR0gvE1nNPM9mgOZIBTzjjXiPxf4lIqQ=="
     },
     "node_modules/esbuild": {
       "version": "0.21.5",
@@ -1597,6 +2008,11 @@
       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
       "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
     },
+    "node_modules/eventemitter3": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
+      "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="
+    },
     "node_modules/follow-redirects": {
       "version": "1.15.6",
       "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
@@ -1642,12 +2058,38 @@
         "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
       }
     },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/gensync": {
       "version": "1.0.0-beta.2",
       "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
       "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
       "engines": {
         "node": ">=6.9.0"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+      "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/globals": {
@@ -1658,12 +2100,67 @@
         "node": ">=4"
       }
     },
+    "node_modules/gopd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+      "dependencies": {
+        "get-intrinsic": "^1.1.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/has-flag": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
       "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
       "engines": {
         "node": ">=4"
+      }
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "dependencies": {
+        "es-define-property": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-proto": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
     "node_modules/html-tags": {
@@ -1684,6 +2181,11 @@
       "engines": {
         "node": ">=0.10.0"
       }
+    },
+    "node_modules/ismobilejs": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz",
+      "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw=="
     },
     "node_modules/js-tokens": {
       "version": "4.0.0",
@@ -1768,6 +2270,11 @@
         "node": ">= 0.6"
       }
     },
+    "node_modules/mini-signals": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mini-signals/-/mini-signals-1.2.0.tgz",
+      "integrity": "sha512-alffqMkGCjjTSwvYMVLx+7QeJ6sTuxbXqBkP21my4iWU5+QpTQAJt3h7htA1OKm9F3BpMM0vnu72QIoiJakrLA=="
+    },
     "node_modules/ms": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -1799,6 +2306,33 @@
       "version": "2.0.14",
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
       "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
+      "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/parse-uri": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/parse-uri/-/parse-uri-1.0.9.tgz",
+      "integrity": "sha512-YZfRHHkEZa6qTfPF/xgZ1ErQYCABfud/Vcqp1Q1GNa7RKwv6Oe0YaxXfQQMnQsGdNTo3fwaT0GbVEX7dMAr7tw==",
+      "engines": {
+        "node": ">= 0.10"
+      }
     },
     "node_modules/picocolors": {
       "version": "1.0.1",
@@ -1855,6 +2389,51 @@
         }
       }
     },
+    "node_modules/pixi.js": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-5.3.12.tgz",
+      "integrity": "sha512-XZzUhrq/m6fx3E0ESv/zXKEVR/GW82dPmbwdapIqsgAldKT2QqBYMfz1WuPf+Q9moPapywVNjjyxPvh+DNPmIg==",
+      "dependencies": {
+        "@pixi/accessibility": "5.3.12",
+        "@pixi/app": "5.3.12",
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/extract": "5.3.12",
+        "@pixi/filter-alpha": "5.3.12",
+        "@pixi/filter-blur": "5.3.12",
+        "@pixi/filter-color-matrix": "5.3.12",
+        "@pixi/filter-displacement": "5.3.12",
+        "@pixi/filter-fxaa": "5.3.12",
+        "@pixi/filter-noise": "5.3.12",
+        "@pixi/graphics": "5.3.12",
+        "@pixi/interaction": "5.3.12",
+        "@pixi/loaders": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/mesh": "5.3.12",
+        "@pixi/mesh-extras": "5.3.12",
+        "@pixi/mixin-cache-as-bitmap": "5.3.12",
+        "@pixi/mixin-get-child-by-name": "5.3.12",
+        "@pixi/mixin-get-global-position": "5.3.12",
+        "@pixi/particles": "5.3.12",
+        "@pixi/polyfill": "5.3.12",
+        "@pixi/prepare": "5.3.12",
+        "@pixi/runner": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/sprite": "5.3.12",
+        "@pixi/sprite-animated": "5.3.12",
+        "@pixi/sprite-tiling": "5.3.12",
+        "@pixi/spritesheet": "5.3.12",
+        "@pixi/text": "5.3.12",
+        "@pixi/text-bitmap": "5.3.12",
+        "@pixi/ticker": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/pixijs"
+      }
+    },
     "node_modules/postcss": {
       "version": "8.4.38",
       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
@@ -1887,6 +2466,25 @@
       "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
       "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
     },
+    "node_modules/punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="
+    },
+    "node_modules/qs": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+      "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+      "dependencies": {
+        "side-channel": "^1.0.6"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/regenerator-runtime": {
       "version": "0.14.1",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
@@ -1896,6 +2494,15 @@
       "version": "1.5.1",
       "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
       "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+    },
+    "node_modules/resource-loader": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/resource-loader/-/resource-loader-3.0.1.tgz",
+      "integrity": "sha512-fBuCRbEHdLCI1eglzQhUv9Rrdcmqkydr1r6uHE2cYHvRBrcLXeSmbE/qI/urFt8rPr/IGxir3BUwM5kUK8XoyA==",
+      "dependencies": {
+        "mini-signals": "^1.2.0",
+        "parse-uri": "^1.0.0"
+      }
     },
     "node_modules/rollup": {
       "version": "4.18.0",
@@ -1947,10 +2554,43 @@
         "semver": "bin/semver.js"
       }
     },
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/shallow-equal": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz",
       "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA=="
+    },
+    "node_modules/side-channel": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "object-inspect": "^1.13.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
     "node_modules/source-map-js": {
       "version": "1.2.0",
@@ -2024,6 +2664,18 @@
       },
       "peerDependencies": {
         "browserslist": ">= 4.21.0"
+      }
+    },
+    "node_modules/url": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz",
+      "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==",
+      "dependencies": {
+        "punycode": "^1.4.1",
+        "qs": "^6.12.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
     "node_modules/vite": {
@@ -2668,6 +3320,349 @@
         "@jridgewell/sourcemap-codec": "^1.4.14"
       }
     },
+    "@pixi/accessibility": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/accessibility/-/accessibility-5.3.12.tgz",
+      "integrity": "sha512-JnfII2VsIeIpvyn1VMNDlhhq5BzHwwHn8sMRKhS3kFyxn4CdP0E4Ktn3/QK0vmL9sHCeTlto5Ybj3uuoKZwCWg==",
+      "requires": {
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/app": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/app/-/app-5.3.12.tgz",
+      "integrity": "sha512-XMpqoO+1BFIVakgHX/VlBaO4qWxg9TitvybDeXZxyVlSCG84DMNulN55jYufVp92nqHhiRr2fAIc9JDccOcNcQ==",
+      "requires": {
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12"
+      }
+    },
+    "@pixi/constants": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.12.tgz",
+      "integrity": "sha512-UcuvZZ8cQu+ZC7ufLpKi8NfZX0FncPuxKd0Rf6u6pzO2SmHPq4C1moXYGDnkZjPFAjNYFFHC7chU+zolMtkL/g=="
+    },
+    "@pixi/core": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.12.tgz",
+      "integrity": "sha512-SKZPU2mP4UE4trWOTcubGekKwopnotbyR2X8nb68wffBd1GzMoaxyakltfJF2oCV/ivrru/biP4CkW9K6MJ56g==",
+      "requires": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/runner": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/ticker": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/display": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.12.tgz",
+      "integrity": "sha512-/fsH/GAxc62rvwTnmrnV8oGCkk4LwJ9pt2Jv3UIorNsjXyL0V5fGw7uZnilF2eSdu6LgQKBMWPOtBF0TNML3lg==",
+      "requires": {
+        "@pixi/math": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/extract": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-5.3.12.tgz",
+      "integrity": "sha512-PRs9sKeZT+eYSD8wGUqSjHhIRrfvnLU65IIJYlmgTxYo9U4rwzykt74v09ggMj/GFUpjsILISA5VIXM1TV79PQ==",
+      "requires": {
+        "@pixi/core": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/filter-alpha": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/filter-alpha/-/filter-alpha-5.3.12.tgz",
+      "integrity": "sha512-/VG+ojZZwStLfiYVKcX4XsXNiPZpv40ZgiDL6igZOMqUsWn7n7dhIgytmbx6uTUWfxIPlOQH3bJGEyAHVEgzZA==",
+      "requires": {
+        "@pixi/core": "5.3.12"
+      }
+    },
+    "@pixi/filter-blur": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/filter-blur/-/filter-blur-5.3.12.tgz",
+      "integrity": "sha512-8zuOmztmuXCl1pXQpycKTS8HmXPtkmMe6xM93Q1gT7CRLzyS97H3pQAh4YuaGOrJslOKBNDrGVzLVY95fxjcTQ==",
+      "requires": {
+        "@pixi/core": "5.3.12",
+        "@pixi/settings": "5.3.12"
+      }
+    },
+    "@pixi/filter-color-matrix": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/filter-color-matrix/-/filter-color-matrix-5.3.12.tgz",
+      "integrity": "sha512-CblKOry/TvFm7L7iangxYtvQgO3a9n5MsmxDUue68DWZa/iI4r/3TSnsvA+Iijr590e9GsWxy3mj9P4HBMOGTA==",
+      "requires": {
+        "@pixi/core": "5.3.12"
+      }
+    },
+    "@pixi/filter-displacement": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/filter-displacement/-/filter-displacement-5.3.12.tgz",
+      "integrity": "sha512-D/LpJxnGi85wHB6VeBpw0FQAN0mzHHUYNxCADwUhknY+SKfP5RhaYOlk79zqOuakBfQTzL3lPgMNH2EC85EJPw==",
+      "requires": {
+        "@pixi/core": "5.3.12",
+        "@pixi/math": "5.3.12"
+      }
+    },
+    "@pixi/filter-fxaa": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/filter-fxaa/-/filter-fxaa-5.3.12.tgz",
+      "integrity": "sha512-EI+foorDnYUAy7VF3fzi635u/dyf5EHZOFovGEDrHm/ZTmEJ1i6RolwexCN94vf6HGfaDrIgNmqFcKWtbIvJFA==",
+      "requires": {
+        "@pixi/core": "5.3.12"
+      }
+    },
+    "@pixi/filter-noise": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/filter-noise/-/filter-noise-5.3.12.tgz",
+      "integrity": "sha512-9KWmlM2zRryY6o0bfNOHAckdCk8X7g9XWZbmEIXZZs7Jr90C1+RhDreqNs8OrMukmNo2cW9hMrshHgJ9aA1ftQ==",
+      "requires": {
+        "@pixi/core": "5.3.12"
+      }
+    },
+    "@pixi/graphics": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-5.3.12.tgz",
+      "integrity": "sha512-uBmFvq15rX0f459/4F2EnR2UhCgfwMWVJDB1L3OnCqQePE/z3ju4mfWEwOT+I7gGejWlGNE6YLdEMVNw/3zb6w==",
+      "requires": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/sprite": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/interaction": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/interaction/-/interaction-5.3.12.tgz",
+      "integrity": "sha512-Ks7vHDfDI58r1TzKHabnQXcXzFbUu2Sb4eQ3/jnzI/xGB5Z8Q0kS7RwJtFOWNZ67HHQdoHFkQIozTUXVXHs3oA==",
+      "requires": {
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/ticker": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/loaders": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/loaders/-/loaders-5.3.12.tgz",
+      "integrity": "sha512-M56m1GKpCChFqSic9xrdtQOXFqwYMvGzDXNpsKIsQbkHooaJhUR5UxSPaNiGC4qWv0TO9w8ANouxeX2v6js4eg==",
+      "requires": {
+        "@pixi/core": "5.3.12",
+        "@pixi/utils": "5.3.12",
+        "resource-loader": "^3.0.1"
+      }
+    },
+    "@pixi/math": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.12.tgz",
+      "integrity": "sha512-VMccUVKSRlLFTGQu6Z450q/W6LVibaFWEo2eSZZfxz+hwjlYiqRPx4heG++4Y6tGskZK7W8l8h+2ixjmo65FCg=="
+    },
+    "@pixi/mesh": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-5.3.12.tgz",
+      "integrity": "sha512-8ZiGZsZQBWoP1p8t9bSl/AfERb5l3QlwnY9zYVMDydF/UWfN1gKcYO4lKvaXw/HnLi4ZjE+OHoZVmePss9zzaw==",
+      "requires": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/mesh-extras": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-5.3.12.tgz",
+      "integrity": "sha512-tEBEEIh96aSGJ/KObdtlNcSzVfgrl9fBhvdUDOHepSyVG+SkmX4LMqP3DkGl6iUBDiq9FBRFaRgbxEd8G2U7yw==",
+      "requires": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/mesh": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/mixin-cache-as-bitmap": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-5.3.12.tgz",
+      "integrity": "sha512-hPiu8jCQJctN3OVJDgh7jqdtRgyB3qH1BWLM742MOZLjYnbOSamnqmI8snG+tba5yj/WfdjKB+8v0WNwEXlH6w==",
+      "requires": {
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/sprite": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/mixin-get-child-by-name": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-5.3.12.tgz",
+      "integrity": "sha512-VQv0GMNmfyBfug9pnvN5s/ZMKJ/AXvg+4RULTpwHFtAwlCdZu9IeNb4eviSSAwtOeBAtqk5c0MQSsdOUWOeIkA==",
+      "requires": {
+        "@pixi/display": "5.3.12"
+      }
+    },
+    "@pixi/mixin-get-global-position": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/mixin-get-global-position/-/mixin-get-global-position-5.3.12.tgz",
+      "integrity": "sha512-qxsfCC9BsKSjBlMH1Su/AVwsrzY8NHfcut5GkVvm2wa9+ypxFwU5fVsmk6+4a9G7af3iqmOlc9YDymAvbi+e8g==",
+      "requires": {
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12"
+      }
+    },
+    "@pixi/particles": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/particles/-/particles-5.3.12.tgz",
+      "integrity": "sha512-SV/gOJBFa4jpsEM90f1bz5EuMMiNAz81mu+lhiUxdQQjZ8y/S4TiK7OAiyc+hUtp97JbJ//6u+4ynGwbhV+WDA==",
+      "requires": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/polyfill": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/polyfill/-/polyfill-5.3.12.tgz",
+      "integrity": "sha512-qkm8TBIb6m7FmE/Cd/yVagONDlVF5/cWFSSnk4pWA/vt/HLNrXgY9Tx0IXAk6NNK/xc5deGcLPc4iw+DlEhsQw==",
+      "requires": {
+        "es6-promise-polyfill": "^1.2.0",
+        "object-assign": "^4.1.1"
+      }
+    },
+    "@pixi/prepare": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-5.3.12.tgz",
+      "integrity": "sha512-loZhLzV4riet9MU72WpWIYF6LgbRM78S4soeZOr5SzL1/U5mBneOOmfStaui7dN2GKQKp5GLygDF4dH3FPalnA==",
+      "requires": {
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/graphics": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/text": "5.3.12",
+        "@pixi/ticker": "5.3.12"
+      }
+    },
+    "@pixi/runner": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.12.tgz",
+      "integrity": "sha512-I5mXx4BiP8Bx5CFIXy3XV3ABYFXbIWaY6FxWsNFkySn0KUhizN7SarPdhFGs//hJuC54EH2FsKKNa98Lfc2nCQ=="
+    },
+    "@pixi/settings": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.12.tgz",
+      "integrity": "sha512-tLAa8tpDGllgj88NMUQn2Obn9MFJfHNF/CKs8aBhfeZGU4yL4PZDtlI+tqaB1ITGl3xxyHmJK+qfmv5lJn+zyA==",
+      "requires": {
+        "ismobilejs": "^1.1.0"
+      }
+    },
+    "@pixi/sprite": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-5.3.12.tgz",
+      "integrity": "sha512-vticet92RFZ3nDZ6/VDwZ7RANO0jzyXOF/5RuJf0yNVJgBoH4cNix520FfsBWE2ormD+z5t1KEmFeW4e35z2kw==",
+      "requires": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/sprite-animated": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/sprite-animated/-/sprite-animated-5.3.12.tgz",
+      "integrity": "sha512-WkGdGRfqboXFzMZ/SM6pCVukYmG2E2IlpcFz7aEeWvKL2Icm4YtaCBpHHDU07vvA6fP6JrstlCx1RyTENtOeGA==",
+      "requires": {
+        "@pixi/core": "5.3.12",
+        "@pixi/sprite": "5.3.12",
+        "@pixi/ticker": "5.3.12"
+      }
+    },
+    "@pixi/sprite-tiling": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-5.3.12.tgz",
+      "integrity": "sha512-5/gtNT46jIo7M69sixqkta1aXVhl4NTwksD9wzqjdZkQG8XPpKmHtXamROY2Fw3R+m+KGgyK8ywAf78tPvxPwg==",
+      "requires": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/sprite": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/spritesheet": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/spritesheet/-/spritesheet-5.3.12.tgz",
+      "integrity": "sha512-0t5HKgLx0uWtENtkW0zVpqvmfoxqMcRAYB7Nwk2lkgZMBPCOFtFF/4Kdp9Sam5X0EBMRGkmIelW3fD6pniSvCw==",
+      "requires": {
+        "@pixi/core": "5.3.12",
+        "@pixi/loaders": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/text": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/text/-/text-5.3.12.tgz",
+      "integrity": "sha512-tvrDVetwVjq1PVDR6jq4umN/Mv/EPHioEOHhyep63yvFIBFv75mDTg2Ye0CPzkmjqwXXvAY+hHpNwuOXTB40xw==",
+      "requires": {
+        "@pixi/core": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/sprite": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/text-bitmap": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/text-bitmap/-/text-bitmap-5.3.12.tgz",
+      "integrity": "sha512-tiorA3XdriJKJtUhMDcKX1umE3hGbaNJ/y0ZLuQ0lCvoTLrN9674HtveutoR9KkXWguDHCSk2cY+y3mNAvjPHA==",
+      "requires": {
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/loaders": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/mesh": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/text": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
+    "@pixi/ticker": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.12.tgz",
+      "integrity": "sha512-YNYUj94XgogipYhPOjbdFBIsy7+U6KmolvK+Av1G88GDac5SDoALb1Nt6s23fd8HIz6b4YnabHOdXGz3zPir1Q==",
+      "requires": {
+        "@pixi/settings": "5.3.12"
+      }
+    },
+    "@pixi/utils": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.12.tgz",
+      "integrity": "sha512-PU/L852YjVbTy/6fDKQtYji6Vqcwi5FZNIjK6JXKuDPF411QfJK3QBaEqJTrexzHlc9Odr0tYECjwtXkCUR02g==",
+      "requires": {
+        "@pixi/constants": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "earcut": "^2.1.5",
+        "eventemitter3": "^3.1.0",
+        "url": "^0.11.0"
+      }
+    },
     "@rollup/rollup-android-arm-eabi": {
       "version": "4.18.0",
       "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz",
@@ -3016,6 +4011,18 @@
         "update-browserslist-db": "^1.0.16"
       }
     },
+    "call-bind": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+      "requires": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.1"
+      }
+    },
     "camelcase": {
       "version": "6.3.0",
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
@@ -3090,6 +4097,16 @@
         "ms": "2.1.2"
       }
     },
+    "define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "requires": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      }
+    },
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -3105,6 +4122,11 @@
       "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz",
       "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w=="
     },
+    "earcut": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz",
+      "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="
+    },
     "electron-to-chromium": {
       "version": "1.4.812",
       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.812.tgz",
@@ -3114,6 +4136,24 @@
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
       "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
+    },
+    "es-define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+      "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+      "requires": {
+        "get-intrinsic": "^1.2.4"
+      }
+    },
+    "es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
+    },
+    "es6-promise-polyfill": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz",
+      "integrity": "sha512-HHb0vydCpoclpd0ySPkRXMmBw80MRt1wM4RBJBlXkux97K7gleabZdsR0gvE1nNPM9mgOZIBTzjjXiPxf4lIqQ=="
     },
     "esbuild": {
       "version": "0.21.5",
@@ -3160,6 +4200,11 @@
       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
       "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
     },
+    "eventemitter3": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
+      "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="
+    },
     "follow-redirects": {
       "version": "1.15.6",
       "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
@@ -3181,20 +4226,71 @@
       "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
       "optional": true
     },
+    "function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
+    },
     "gensync": {
       "version": "1.0.0-beta.2",
       "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
       "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
+    },
+    "get-intrinsic": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+      "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+      "requires": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.0"
+      }
     },
     "globals": {
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
       "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
     },
+    "gopd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+      "requires": {
+        "get-intrinsic": "^1.1.3"
+      }
+    },
     "has-flag": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
       "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+    },
+    "has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "requires": {
+        "es-define-property": "^1.0.0"
+      }
+    },
+    "has-proto": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="
+    },
+    "has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+    },
+    "hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "requires": {
+        "function-bind": "^1.1.2"
+      }
     },
     "html-tags": {
       "version": "3.3.1",
@@ -3205,6 +4301,11 @@
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz",
       "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g=="
+    },
+    "ismobilejs": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz",
+      "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw=="
     },
     "js-tokens": {
       "version": "4.0.0",
@@ -3268,6 +4369,11 @@
         "mime-db": "1.52.0"
       }
     },
+    "mini-signals": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mini-signals/-/mini-signals-1.2.0.tgz",
+      "integrity": "sha512-alffqMkGCjjTSwvYMVLx+7QeJ6sTuxbXqBkP21my4iWU5+QpTQAJt3h7htA1OKm9F3BpMM0vnu72QIoiJakrLA=="
+    },
     "ms": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -3287,6 +4393,21 @@
       "version": "2.0.14",
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
       "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
+    },
+    "object-inspect": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
+      "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g=="
+    },
+    "parse-uri": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/parse-uri/-/parse-uri-1.0.9.tgz",
+      "integrity": "sha512-YZfRHHkEZa6qTfPF/xgZ1ErQYCABfud/Vcqp1Q1GNa7RKwv6Oe0YaxXfQQMnQsGdNTo3fwaT0GbVEX7dMAr7tw=="
     },
     "picocolors": {
       "version": "1.0.1",
@@ -3310,6 +4431,47 @@
         }
       }
     },
+    "pixi.js": {
+      "version": "5.3.12",
+      "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-5.3.12.tgz",
+      "integrity": "sha512-XZzUhrq/m6fx3E0ESv/zXKEVR/GW82dPmbwdapIqsgAldKT2QqBYMfz1WuPf+Q9moPapywVNjjyxPvh+DNPmIg==",
+      "requires": {
+        "@pixi/accessibility": "5.3.12",
+        "@pixi/app": "5.3.12",
+        "@pixi/constants": "5.3.12",
+        "@pixi/core": "5.3.12",
+        "@pixi/display": "5.3.12",
+        "@pixi/extract": "5.3.12",
+        "@pixi/filter-alpha": "5.3.12",
+        "@pixi/filter-blur": "5.3.12",
+        "@pixi/filter-color-matrix": "5.3.12",
+        "@pixi/filter-displacement": "5.3.12",
+        "@pixi/filter-fxaa": "5.3.12",
+        "@pixi/filter-noise": "5.3.12",
+        "@pixi/graphics": "5.3.12",
+        "@pixi/interaction": "5.3.12",
+        "@pixi/loaders": "5.3.12",
+        "@pixi/math": "5.3.12",
+        "@pixi/mesh": "5.3.12",
+        "@pixi/mesh-extras": "5.3.12",
+        "@pixi/mixin-cache-as-bitmap": "5.3.12",
+        "@pixi/mixin-get-child-by-name": "5.3.12",
+        "@pixi/mixin-get-global-position": "5.3.12",
+        "@pixi/particles": "5.3.12",
+        "@pixi/polyfill": "5.3.12",
+        "@pixi/prepare": "5.3.12",
+        "@pixi/runner": "5.3.12",
+        "@pixi/settings": "5.3.12",
+        "@pixi/sprite": "5.3.12",
+        "@pixi/sprite-animated": "5.3.12",
+        "@pixi/sprite-tiling": "5.3.12",
+        "@pixi/spritesheet": "5.3.12",
+        "@pixi/text": "5.3.12",
+        "@pixi/text-bitmap": "5.3.12",
+        "@pixi/ticker": "5.3.12",
+        "@pixi/utils": "5.3.12"
+      }
+    },
     "postcss": {
       "version": "8.4.38",
       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
@@ -3325,6 +4487,19 @@
       "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
       "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
     },
+    "punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="
+    },
+    "qs": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+      "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+      "requires": {
+        "side-channel": "^1.0.6"
+      }
+    },
     "regenerator-runtime": {
       "version": "0.14.1",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
@@ -3334,6 +4509,15 @@
       "version": "1.5.1",
       "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
       "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+    },
+    "resource-loader": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/resource-loader/-/resource-loader-3.0.1.tgz",
+      "integrity": "sha512-fBuCRbEHdLCI1eglzQhUv9Rrdcmqkydr1r6uHE2cYHvRBrcLXeSmbE/qI/urFt8rPr/IGxir3BUwM5kUK8XoyA==",
+      "requires": {
+        "mini-signals": "^1.2.0",
+        "parse-uri": "^1.0.0"
+      }
     },
     "rollup": {
       "version": "4.18.0",
@@ -3373,10 +4557,34 @@
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
       "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
     },
+    "set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "requires": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      }
+    },
     "shallow-equal": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz",
       "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA=="
+    },
+    "side-channel": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+      "requires": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "object-inspect": "^1.13.1"
+      }
     },
     "source-map-js": {
       "version": "1.2.0",
@@ -3420,6 +4628,15 @@
         "picocolors": "^1.0.1"
       }
     },
+    "url": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz",
+      "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==",
+      "requires": {
+        "punycode": "^1.4.1",
+        "qs": "^6.12.3"
+      }
+    },
     "vite": {
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz",
diff --git a/zy-asrs-admin/package.json b/zy-asrs-admin/package.json
index 66fee95..ec9100c 100644
--- a/zy-asrs-admin/package.json
+++ b/zy-asrs-admin/package.json
@@ -14,6 +14,7 @@
     "ant-design-vue": "^4.2.3",
     "axios": "^1.7.2",
     "pinia": "^2.1.7",
+    "pixi.js": "^5.3.12",
     "vue": "^3.4.29",
     "vue-router": "^4.3.3",
     "vue3-print-nb": "^0.1.4"
@@ -23,4 +24,4 @@
     "@vue/babel-plugin-jsx": "^1.2.2",
     "vite": "^5.3.1"
   }
-}
\ No newline at end of file
+}
diff --git a/zy-asrs-admin/src/App.vue b/zy-asrs-admin/src/App.vue
index 35965a2..5f4bb58 100644
--- a/zy-asrs-admin/src/App.vue
+++ b/zy-asrs-admin/src/App.vue
@@ -3,17 +3,33 @@
 import IndexView from './views/IndexView.vue'
 import LoginView from './views/login/LoginView.vue'
 import { globalState } from './config.js'
-import zhCN from 'ant-design-vue/es/locale/zh_CN';
-import enUS from 'ant-design-vue/es/locale/en_US';
-import dayjs from 'dayjs';
-import 'dayjs/locale/zh-cn';
+import zh_CN from 'ant-design-vue/es/locale/zh_CN';
+import zh_HK from 'ant-design-vue/es/locale/zh_CN';
+import en_US from 'ant-design-vue/es/locale/en_US';
+import es_ES from 'ant-design-vue/es/locale/es_ES';
+import ar_EG from 'ant-design-vue/es/locale/ar_EG';
+import de_DE from 'ant-design-vue/es/locale/de_DE';
+import fr_FR from 'ant-design-vue/es/locale/fr_FR';
+import ru_RU from 'ant-design-vue/es/locale/ru_RU';
+import ko_KR from 'ant-design-vue/es/locale/ko_KR';
+// import dayjs from 'dayjs';
+// import 'dayjs/locale/zh-cn';
+// import 'dayjs/locale/zh-hk';
+// import 'dayjs/locale/es';
+// dayjs.locale('zh-cn');
 const context = getCurrentInstance()?.appContext.config.globalProperties;
-dayjs.locale('zh-cn');
 provide('globalState', globalState);
 
 const localeType = {
-  zhCN,
-  enUS,
+  zh_CN,
+  zh_HK,
+  en_US,
+  es_ES,
+  ar_EG,
+  de_DE,
+  fr_FR,
+  ru_RU,
+  ko_KR,
 };
 
 console.log('%c 涓壃绔嬪簱骞冲彴 %c 1.0.0','background-color:rgb(53,73,94);color: #fff;border-radius:2px 0 0 2px;padding:2px 4px;','background-color:rgb(25,190,107);color: #fff;border-radius:0 2px 2px 0;padding:2px 4px;font: 9pt "Apercu Regular", Georgia, "Times New Roman", Times, serif;')
diff --git a/zy-asrs-admin/src/components/loc/map/index.vue b/zy-asrs-admin/src/components/loc/map/index.vue
new file mode 100644
index 0000000..3a1cc8b
--- /dev/null
+++ b/zy-asrs-admin/src/components/loc/map/index.vue
@@ -0,0 +1,772 @@
+<script setup>
+import { ref, onMounted, watch } from 'vue';
+import { get, post, postBlob } from '@/utils/request.js'
+import { message, Modal } from 'ant-design-vue';
+import { logout } from '@/config.js';
+import { formatMessage } from '@/utils/localeUtils.js';
+import {
+    CompressOutlined,
+} from "@ant-design/icons-vue";
+import * as PIXI from 'pixi.js'
+
+let width = 25;
+let height = 25;
+let pixiApp;
+let pixiStageMap = new Map();
+let objectsContainer;
+let map = []
+
+const pixiView = ref(null)
+const mapFps = ref(0)
+const currentLev = ref(1)
+const levList = ref([])
+const pointContainerWidth = ref(0)
+const drawer = ref(false)
+const drawerLocData = ref(null)
+const drawerLocDetls = ref([])
+const drawerLocDetlField = ref([])
+
+const drawerOper = ref(false)
+const drawerOperLocNo = ref(null)
+const drawerOperMatnr = ref(null)
+const drawerOperMaktx = ref(null)
+
+onMounted(() => {
+    createMap();
+    init(currentLev.value);
+})
+
+watch(drawer, (newVal, oldVal) => {
+    if (!drawer.value) {
+        var rectangle = pixiStageMap.get(drawerLocData.value.locNo)
+        updateColor(rectangle, rectangle.originColor);//鎭㈠棰滆壊
+    }
+})
+
+function switchLev(lev) {
+    currentLev.value = lev;
+    init(lev);
+}
+
+function init(lev) {
+    get('/api/locMap/getData/' + lev + '/auth', {}).then(resp => {
+        let result = resp.data;
+        if (result.code == 200) {
+            let tmp = JSON.parse(result.data);
+            let tmpMap = []
+            tmp.forEach((item, index) => {
+                let data2 = []
+                item.forEach((val, idx) => {
+                    val.searchStatus = false//鎼滅储鏍囪
+                    val.rectangle = null;
+                    data2.push(val)
+                })
+                pointContainerWidth.value = item.length * (40 + 1)
+                tmpMap.push(data2)
+            })
+
+            createMapData(tmpMap);
+        }
+    })
+
+    get('/api/locMap/getLev', {}).then(resp => {
+        let result = resp.data;
+        if (result.code == 200) {
+            let tmp = result.data;
+            levList.value = tmp;
+        }
+    })
+}
+
+function createMap() {
+    //Create a Pixi Application
+    pixiApp = new PIXI.Application({
+        width: pixiView.value.offsetWidth,
+        height: window.innerHeight * 0.75,
+        backgroundColor: 0xF5F7F9FF,
+        // resizeTo: window
+    });
+
+    //Add the canvas that Pixi automatically created for you to the HTML document
+    pixiView.value.appendChild(pixiApp.view)
+
+    // 鍒涘缓涓�涓鍣ㄦ潵绠$悊澶ф壒閲忕殑鏄剧ず瀵硅薄
+    objectsContainer = new PIXI.Container();
+
+    pixiApp.stage.addChild(objectsContainer);
+
+    //*******************鎷栧姩鐢诲竷*******************
+    let stageOriginalPos;
+    let mouseDownPoint;
+    let touchBlank = false;
+    pixiApp.renderer.plugins.interaction.on(
+        'pointerdown',
+        (event) => {
+            const globalPos = event.data.global;
+            // 璁板綍涓媠tage鍘熸潵鐨勪綅缃�
+            stageOriginalPos = [pixiApp.stage.position._x, pixiApp.stage.position._y];
+            // 璁板綍涓媘ouse down鐨勪綅缃�
+            mouseDownPoint = [globalPos.x, globalPos.y];
+            if (!event.target) {
+                // 鐐瑰埌浜嗙敾甯冪殑绌虹櫧浣嶇疆
+                touchBlank = true;
+            }
+        }
+    );
+
+    pixiApp.renderer.plugins.interaction.on(
+        'pointermove',
+        (event) => {
+            const globalPos = event.data.global;
+
+            if (touchBlank) {
+                // 鎷栨嫿鐢诲竷
+                const dx = globalPos.x - mouseDownPoint[0];
+                const dy = globalPos.y - mouseDownPoint[1];
+                pixiApp.stage.position.set(
+                    stageOriginalPos[0] + dx,
+                    stageOriginalPos[1] + dy
+                );
+            }
+        }
+    );
+
+    pixiApp.renderer.plugins.interaction.on(
+        'pointerup',
+        (event) => {
+            touchBlank = false;
+        }
+    );
+    //*******************鎷栧姩鐢诲竷*******************
+
+    //*******************缂╂斁鐢诲竷*******************
+    pixiApp.view.addEventListener('wheel', (event) => {
+        event.stopPropagation();
+        event.preventDefault();
+        // 鍥犱负鐢诲竷鏄厖婊¤绐楃殑锛屾墍浠lientX绛変簬mouse point鍦╮enderer涓婄殑x鍧愭爣
+        const globalPos = [event.clientX, event.clientY];
+        const delta = event.deltaY;
+        const oldZoom = pixiApp.stage.scale.x;
+        let newZoom = oldZoom * 0.999 ** delta;
+
+        // const oldStageMatrix = app.stage.localTransform.clone();
+        // const oldStagePos = oldStageMatrix.applyInverse(pointerGlobalPos);
+        const oldStagePos = globalPos;
+        const dx = oldStagePos[0] * oldZoom - oldStagePos[0] * newZoom;
+        const dy = oldStagePos[1] * oldZoom - oldStagePos[1] * newZoom;
+
+        pixiApp.stage.setTransform(
+            pixiApp.stage.position.x + dx,
+            pixiApp.stage.position.y + dy,
+            newZoom,
+            newZoom,
+            0,
+            0,
+            0,
+            0,
+            0
+        );
+
+    });
+    //*******************缂╂斁鐢诲竷*******************
+
+    //*******************FPS*******************
+    var g_Time = 0;
+    pixiApp.ticker.add((delta) => {
+        var timeNow = (new Date()).getTime();
+        var timeDiff = timeNow - g_Time;
+        g_Time = timeNow;
+        var fps = 1000 / timeDiff;
+        mapFps.value = parseInt(fps)
+    });
+    //*******************FPS*******************
+}
+
+function createMapData(map) {
+    objectsContainer.removeChildren();
+    map.forEach((item, index) => {
+        for (let idx = 0; idx < item.length; idx++) {
+            let val = item[idx]
+            if (val.value < 0) {
+                continue;
+            }
+            let rectangle = getContainer(val.value, idx * width, index * height, map[index][idx].locSts);
+            rectangle.on('click', (e) => {
+                openLocDrawer(index, idx, map[index][idx], { x: e.data.originalEvent.offsetX, y: e.data.originalEvent.offsetY })
+                updateColor(rectangle, 0x9900ff);
+            });
+            rectangle.locX = index;
+            rectangle.locY = idx;
+
+            pixiStageMap.set(map[index][idx].locNo, rectangle);
+            objectsContainer.addChild(rectangle);
+        }
+    })
+
+    //瑙嗚灞呬腑
+    let containerWidth = (pixiApp.view.width - objectsContainer.width) / 2;
+    let containerHeight = (pixiApp.view.height - objectsContainer.height) / 2;
+    pixiApp.stage.position.set(containerWidth, containerHeight);
+}
+
+function containerAppViewCenter() {
+    //瑙嗚灞呬腑
+    let containerWidth = (pixiApp.view.width - objectsContainer.width) / 2;
+    let containerHeight = (pixiApp.view.height - objectsContainer.height) / 2;
+    pixiApp.stage.position.set(containerWidth, containerHeight);
+}
+
+function openLocDrawer(x, y, loc, e) {
+    drawer.value = true;
+    drawerLocData.value = loc;
+
+    get('/api/locDetl/locNo/' + loc.locNo, {}).then(resp => {
+        let result = resp.data;
+        if (result.code == 200) {
+            drawerLocDetls.value = result.data;
+        }
+    })
+}
+
+function getContainer(value, x, y, locSts) {
+    let rectangle = new PIXI.Graphics();
+    if (value === 0) {
+        if (locSts === "F") {
+            rectangle.beginFill(0xff0000);
+            rectangle.originColor = 0xff0000;
+        } else if (locSts === "O") {
+            rectangle.beginFill(0x55aaff);
+            rectangle.originColor = 0x55aaff;
+        } else if (locSts === "D") {
+            rectangle.beginFill(0xc2c934);
+            rectangle.originColor = 0xc2c934;
+        } else if (locSts === "P") {
+            rectangle.beginFill(0xf1aa19);
+            rectangle.originColor = 0xf1aa19;
+        } else if (locSts === "R") {
+            rectangle.beginFill(0x618593);
+            rectangle.originColor = 0x618593;
+        } else if (locSts === "S") {
+            rectangle.beginFill(0xfa736f);
+            rectangle.originColor = 0xfa736f;
+        } else {
+            rectangle.beginFill(0x86779d);
+            rectangle.originColor = 0x86779d;
+        }
+    } else if (value === 3) {//姣嶈建閬�
+        rectangle.beginFill(0x00ff7f);
+        rectangle.originColor = 0x00ff7f;
+        rectangle.visible = false;
+    } else if (value === 4) {//绔欑偣
+        rectangle.beginFill(0xffff00);
+        rectangle.originColor = 0xffff00;
+        rectangle.visible = false;
+    } else if (value === 5) {//鍏呯數妗�
+        rectangle.beginFill(0xffaa7f);
+        rectangle.originColor = 0xffaa7f;
+        rectangle.visible = false;
+    } else if (value === 9) {//杞ㄨ抗
+        rectangle.beginFill(0xff0000);
+        rectangle.originColor = 0xff0000;
+    }
+    // rectangle.lineStyle(1, 0xffffff, 1);
+    rectangle.drawRect(0, 0, width, height);
+    rectangle.x = x;
+    rectangle.y = y;
+    // 璁剧疆鏄惁鍙互浜や簰
+    rectangle.interactive = true;
+    rectangle.endFill();
+
+    // 鍒涘缓鏂囨湰瀵硅薄
+    const style = new PIXI.TextStyle({
+        fontSize: 14 * window.devicePixelRatio,
+        fill: 'white',
+        align: 'center', // 璁剧疆鏂囨湰姘村钩灞呬腑瀵归綈
+        verticalAlign: 'middle' // 璁剧疆鏂囨湰鍨傜洿灞呬腑瀵归綈
+    });
+    const text = new PIXI.Text(locSts, style);
+    text.anchor.set(0.5); // 璁剧疆鏂囨湰閿氱偣涓轰腑蹇冪偣
+    text.position.set(rectangle.width / 2, rectangle.height / 2); // 灏嗘枃鏈綅缃缃负Graphics瀵硅薄鐨勪腑蹇冪偣
+    // 灏嗘枃鏈璞℃坊鍔犲埌Graphics瀵硅薄涓�
+    rectangle.addChild(text);
+
+    return rectangle;
+}
+
+/**
+* 鏇存柊棰滆壊
+*/
+function updateColor(rectangle, color) {
+    rectangle.clear()
+    rectangle.beginFill(color);
+    rectangle.drawRect(0, 0, width, height);
+}
+
+</script>
+
+<script>
+export default {
+    name: '搴撲綅鍦板浘'
+}
+</script>
+
+<template>
+    <div style="position: relative;overflow: hidden;">
+        <div ref="pixiView">
+
+        </div>
+
+        <!--杈撳嚭鎿嶄綔鍜孎PS-->
+        <div style="position: absolute;top: 0px;right: 10px;user-select: none;">
+            <div>FPS:{{ mapFps }}</div>
+            <a-button @click="drawerOper = true">鎿嶄綔</a-button>
+        </div>
+
+        <!--杈撳嚭鎿嶄綔鍜孎PS-->
+        <div style="position: absolute;bottom: 0px;left: 0px;user-select: none;">
+            <a-button type="dashed" @click="containerAppViewCenter">
+                <CompressOutlined />
+            </a-button>
+        </div>
+
+        <div>
+            <a-drawer v-model:open="drawer" placement="right" style="background: #f3f3f3;">
+                <div style="margin-top: 10px;">
+                    <a-tag>{{ formatMessage('locMap.locNo', '搴撲綅鍙�') }}</a-tag>{{ drawerLocData.locNo }}
+                </div>
+                <div style="margin-top: 20px;">
+                    <a-tag>{{ formatMessage('locMap.locSts', '搴撲綅鐘舵��') }}</a-tag>{{ drawerLocData.locSts }}.{{
+                        drawerLocData.locSts$ }}
+                </div>
+                <div style="margin-top: 20px;">
+                    <div v-for="(item, index) in drawerLocDetls" :key="index" style="margin-top: 20px;">
+                        <a-card :title="item.matnr" :bordered="false" style="width: 300px">
+                            <div>{{ formatMessage('locMap.batch', '鎵瑰彿') }}锛歿{ item.batch }}</div>
+                            <div>{{ formatMessage('locMap.orderNo', '鍗曟嵁缂栧彿') }}锛歿{ item.orderNo }}</div>
+                            <div>{{ formatMessage('locMap.anfme', '鏁伴噺') }}锛歿{ item.anfme }}</div>
+                            <div v-for="(field, index) in item.dynamicFieldsList" :key="index">{{
+                                formatMessage('locMap.' + field.key, field.desc) }}锛歿{ field.value }}</div>
+                        </a-card>
+                    </div>
+                </div>
+            </a-drawer>
+        </div>
+
+        <div>
+            <a-drawer v-model:open="drawerOper" placement="right">
+                <div style="margin-top: 10px;">
+                    <div>
+                        {{ formatMessage('locMap.locNo', '搴撲綅鍙�') }}
+                    </div>
+                    <div style="margin-top: 10px;">
+                        <a-input v-model:value="drawerOperLocNo" :placeholder="formatMessage('locMap.locNo', '搴撲綅鍙�')" />
+                    </div>
+                </div>
+                <div style="margin-top: 20px;">
+                    <div>
+                        {{ formatMessage('locMap.matnr', '鍟嗗搧缂栧彿') }}
+                    </div>
+                    <div style="margin-top: 10px;">
+                        <a-input v-model:value="drawerOperMatnr" :placeholder="formatMessage('locMap.matnr', '鍟嗗搧缂栧彿')" />
+                    </div>
+                </div>
+                <div style="margin-top: 20px;">
+                    <div>
+                        {{ formatMessage('locMap.maktx', '鍟嗗搧鍚嶇О') }}
+                    </div>
+                    <div style="margin-top: 10px;">
+                        <a-input v-model:value="drawerOperMaktx" :placeholder="formatMessage('locMap.maktx', '鍟嗗搧鍚嶇О')" />
+                    </div>
+                </div>
+                <div style="margin-top: 20px;">
+                    <a-button type="primary" @click="drawerOper = true">鎼滅储</a-button>
+                </div>
+
+                <div style="margin-top: 50px;">
+                    <div v-for="(lev, index) in levList" :key="index" style="margin-top: 10px;">
+                        <a-button :type="currentLev == lev ? 'primary' : 'dashed'" @click="switchLev(lev)"
+                            style="width: 100%;">{{ lev }}F</a-button>
+                    </div>
+                </div>
+            </a-drawer>
+        </div>
+    </div>
+</template>
+
+<style>
+* {
+    margin: 0;
+    padding: 0;
+}
+
+.pointContainer {
+    display: flex;
+    justify-content: center;
+    /*margin-top: 1px;*/
+}
+
+.pointBox {
+    background: #bababa;
+    width: 40px;
+    height: 40px;
+    /*margin-right: 1px;*/
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    font-size: 14px;
+    user-select: none;
+    color: #fff;
+}
+
+.pointBox:hover {
+    background: #00ff7f;
+}
+
+.pointBoxEmpty {
+    background: #c2c934;
+}
+
+.pointBoxOut {
+    background: #f1aa19;
+}
+
+.pointBoxOutYy {
+    background: #618593;
+}
+
+.pointBoxInYy {
+    background: #fa736f;
+}
+
+.pointBoxGreen {
+    background: #00ff7f;
+}
+
+.pointBoxBlue {
+    background: #55aaff;
+}
+
+.pointBoxRed {
+    background: #ff0000;
+}
+
+.pointBoxStart {
+    background: #ffaa00;
+}
+
+.pointBoxEnd {
+    background: #ff55ff;
+}
+
+.pointBoxStation {
+    background: #ffff00;
+}
+
+.chargeStation {
+    background: #ffaa7f;
+}
+
+.pointBoxDefault {
+    background: #86779d;
+}
+
+.pointBoxSelected {
+    background: #00ff7f !important;
+}
+
+.pointBoxSearch {
+    background: #9900ff;
+}
+
+.crnLine {
+    width: auto;
+    height: 2px;
+    margin: 10px 0;
+    background: #000;
+    position: relative;
+}
+
+.popBox {
+    position: absolute;
+}
+
+/*鍗$墖鏍峰紡start*/
+.apple-card {
+    width: 190px;
+    height: 254px;
+    margin: 0 auto;
+    background-color: #011522;
+    border-radius: 8px;
+    z-index: 1;
+    animation: fadeInOut 0.5s 1;
+}
+
+.apple-card .tools {
+    display: flex;
+    align-items: center;
+    padding: 9px;
+}
+
+.apple-card .circle {
+    padding: 0 4px;
+}
+
+.apple-card .box {
+    display: inline-block;
+    align-items: center;
+    width: 10px;
+    height: 10px;
+    padding: 1px;
+    border-radius: 50%;
+}
+
+.apple-card .red {
+    background-color: #ff605c;
+    position: relative;
+}
+
+.apple-card .red:hover {
+    background-color: #ff0300;
+}
+
+.apple-card .red:hover::before {
+    content: "x";
+    font-size: 11px;
+    color: #fff;
+    width: 10px;
+    height: 10px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    position: absolute;
+    animation: fadeInOut 0.5s 1;
+}
+
+.apple-card .yellow {
+    background-color: #ffbd44;
+}
+
+.apple-card .green {
+    background-color: #00ca4e;
+}
+
+.apple-card .card-content {
+    color: #fff;
+    padding: 10px;
+}
+
+/*鍗$墖鏍峰紡end*/
+
+/*婊戝姩鍗$墖start*/
+.hoverCard {
+    width: 150px;
+    height: 224px;
+    border-radius: 20px;
+    background: #f5f5f5;
+    position: relative;
+    padding: 1.8rem;
+    border: 2px solid #c3c6ce;
+    transition: 0.5s ease-out;
+    overflow: visible;
+    margin-top: 30px;
+}
+
+.hoverCard .card-details {
+    color: black;
+    height: 100%;
+    gap: .5em;
+    display: grid;
+    place-content: center;
+}
+
+.hoverCard .card-button {
+    transform: translate(-50%, 125%);
+    width: 60%;
+    border-radius: 1rem;
+    border: none;
+    background-color: #008bf8;
+    color: #fff;
+    font-size: 1rem;
+    padding: .5rem 1rem;
+    position: absolute;
+    left: 50%;
+    bottom: 0;
+    opacity: 0;
+    transition: 0.3s ease-out;
+}
+
+.hoverCard .text-body {
+    color: rgb(134, 134, 134);
+}
+
+/*Text*/
+.hoverCard .text-title {
+    font-size: 1.5em;
+    font-weight: bold;
+}
+
+/*Hover*/
+.hoverCard:hover {
+    border-color: #008bf8;
+    box-shadow: 0 4px 18px 0 rgba(0, 0, 0, 0.25);
+}
+
+.hoverCard:hover .card-button {
+    transform: translate(-50%, 50%);
+    opacity: 1;
+}
+
+/*婊戝姩鍗$墖end*/
+
+/*妤煎眰鎺у埗start*/
+.floorSelect {
+    --text: #414856;
+    --radio: #7C96B2;
+    --radio-checked: #4F29F0;
+    --radio-size: 20px;
+    --width: 150px;
+    --height: 200px;
+    --border-radius: 10px;
+    width: var(--width);
+    height: var(--height);
+    border-radius: var(--border-radius);
+    color: var(--text);
+    position: relative;
+    box-shadow: 0 10px 30px rgba(65, 72, 86, 0.05);
+    display: grid;
+    grid-template-columns: auto var(--radio-size);
+    align-items: center;
+}
+
+.floorSelect label {
+    cursor: pointer;
+}
+
+.floorSelect input[type="radio"] {
+    -webkit-appearance: none;
+    -moz-appearance: none;
+    position: relative;
+    height: var(--radio-size);
+    width: var(--radio-size);
+    outline: none;
+    margin: 0;
+    cursor: pointer;
+    border: 2px solid var(--radio);
+    background: transparent;
+    border-radius: 50%;
+    display: grid;
+    justify-self: end;
+    justify-items: center;
+    align-items: center;
+    overflow: hidden;
+    transition: border .5s ease;
+}
+
+.floorSelect input[type="radio"]::before,
+.floorSelect input[type="radio"]::after {
+    content: "";
+    display: flex;
+    justify-self: center;
+    border-radius: 50%;
+}
+
+.floorSelect input[type="radio"]::before {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    z-index: 1;
+    opacity: var(--opacity, 1);
+}
+
+.floorSelect input[type="radio"]::after {
+    position: relative;
+    width: calc(100% /2);
+    height: calc(100% /2);
+    background: var(--radio-checked);
+    top: var(--y, 100%);
+    transition: top 0.5s cubic-bezier(0.48, 1.97, 0.5, 0.63);
+}
+
+.floorSelect input[type="radio"]:checked {
+    --radio: var(--radio-checked);
+}
+
+.floorSelect input[type="radio"]:checked::after {
+    --y: 0%;
+    animation: stretch-animate .3s ease-out .17s;
+}
+
+.floorSelect input[type="radio"]:checked::before {
+    --opacity: 0;
+}
+
+.floorSelect input[type="radio"]:checked~input[type="radio"]::after {
+    --y: -100%;
+}
+
+.floorSelect input[type="radio"]:not(:checked)::before {
+    --opacity: 1;
+    transition: opacity 0s linear .5s;
+}
+
+@keyframes stretch-animate {
+    0% {
+        transform: scale(1, 1);
+    }
+
+    28% {
+        transform: scale(1.15, 0.85);
+    }
+
+    50% {
+        transform: scale(0.9, 1.1);
+    }
+
+    100% {
+        transform: scale(1, 1);
+    }
+}
+
+/*妤煎眰鎺у埗end*/
+
+/*鎼滅储start*/
+.search-input {
+    line-height: 28px;
+    border: 2px solid transparent;
+    border-bottom-color: #777;
+    padding: .2rem 0;
+    outline: none;
+    background-color: transparent;
+    color: #0d0c22;
+    transition: .3s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+
+.search-input:focus,
+.search-input:hover {
+    outline: none;
+    padding: .2rem 1rem;
+    border-radius: 1rem;
+    border-color: #7a9cc6;
+}
+
+.search-input::placeholder {
+    color: #777;
+}
+
+.search-input:focus::placeholder {
+    opacity: 0;
+    transition: opacity .3s;
+}
+
+/*鎼滅储end*/
+
+@keyframes fadeInOut {
+    0% {
+        opacity: 0;
+    }
+
+    100% {
+        opacity: 1;
+    }
+}
+</style>
diff --git a/zy-asrs-admin/src/components/locDetl/show.vue b/zy-asrs-admin/src/components/locDetl/show.vue
index bfbb01e..794ad29 100644
--- a/zy-asrs-admin/src/components/locDetl/show.vue
+++ b/zy-asrs-admin/src/components/locDetl/show.vue
@@ -157,12 +157,12 @@
 }
 
 const handleOk = () => {
-    openDetl.value = false;
+    open.value = false;
 }
 
 const handleCancel = () => {
-    openDetl.value = false;
-    orderId.value = null;
+    open.value = false;
+    locId.value = null;
 }
 
 watch(locId, (newVal, oldVal) => {
diff --git a/zy-asrs-admin/src/config.js b/zy-asrs-admin/src/config.js
index 791414c..674288d 100644
--- a/zy-asrs-admin/src/config.js
+++ b/zy-asrs-admin/src/config.js
@@ -4,15 +4,36 @@
     url: 'http://127.0.0.1:8081/wms',
     token: '',
     user: null,
-    locale: 'zhCN', // 榛樿璇█
+    locale: 'zh_CN', // 榛樿璇█
     currentHost: null,
     localeList: {//璇█鍒楄〃
-        'zhCN': {
+        'zh_CN': {
             desc: '绠�浣撲腑鏂�'
         },
-        'enUS': {
-            desc: 'English'
-        }
+        'zh_HK': {
+            desc: '绻佷綋涓枃'
+        },
+        'en_US': {
+            desc: '鑻辫'
+        },
+        'es_ES': {
+            desc: '瑗跨彮鐗欒'
+        },
+        'ar_EG': {
+            desc: '闃挎媺浼'
+        },
+        'de_DE': {
+            desc: '寰疯'
+        },
+        'fr_FR': {
+            desc: '娉曡'
+        },
+        'ru_RU': {
+            desc: '淇勭綏鏂'
+        },
+        'ko_KR': {
+            desc: '闊╄'
+        },
     },
     localeData: {}
 });
diff --git a/zy-asrs-admin/src/views/base/locTypeBind/edit.vue b/zy-asrs-admin/src/views/base/locTypeBind/edit.vue
index 238736f..d72df00 100644
--- a/zy-asrs-admin/src/views/base/locTypeBind/edit.vue
+++ b/zy-asrs-admin/src/views/base/locTypeBind/edit.vue
@@ -132,7 +132,7 @@
                     ]">
                     </a-select>
                 </a-form-item>
-                <a-form-item :label="formatMessage('db.man_loc_type_bind.create_time', '娣诲姞鏃堕棿')" name="createTime"
+                <!-- <a-form-item :label="formatMessage('db.man_loc_type_bind.create_time', '娣诲姞鏃堕棿')" name="createTime"
                     style="width: 250px;">
                     <a-date-picker v-model:value="formData.createTime" show-time format="YYYY-MM-DD HH:mm:ss"
                         value-format="YYYY-MM-DD HH:mm:ss" />
@@ -155,7 +155,7 @@
                         style="width: 100%" show-search :options="userQueryList" optionFilterProp="label"
                         optionLabelProp="label">
                     </a-select>
-                </a-form-item>
+                </a-form-item> -->
                 <a-form-item :label="formatMessage('db.man_loc_type_bind.memo', '澶囨敞')" name="memo"
                     style="width: 250px;">
                     <a-input v-model:value="formData.memo" />
diff --git a/zy-asrs-admin/src/views/base/locTypeBind/index.vue b/zy-asrs-admin/src/views/base/locTypeBind/index.vue
index 4490c60..fa9de93 100644
--- a/zy-asrs-admin/src/views/base/locTypeBind/index.vue
+++ b/zy-asrs-admin/src/views/base/locTypeBind/index.vue
@@ -5,6 +5,7 @@
 import { message, Modal } from 'ant-design-vue';
 import { logout } from '@/config.js';
 import EditView from './edit.vue'
+import InitView from './init.vue'
 import { formatMessage } from '@/utils/localeUtils.js';
 const context = getCurrentInstance()?.appContext.config.globalProperties;
 
@@ -15,6 +16,7 @@
 let pageSize = 10;
 const searchInput = ref("")
 const editChild = ref(null)
+const initChild = ref(null)
 
 let currentLocType = ref(null)
 let tableData = ref([]);
@@ -133,6 +135,10 @@
       message.error(result.msg);
     }
   })
+}
+
+const handleInit = (item) => {
+  initChild.value.open = true;
 }
 
 const handleEdit = (item) => {
@@ -259,12 +265,13 @@
     </a-card>
 
     <a-card style="flex: 10;">
+      <InitView ref="initChild" @tableReload="handleTableReload" />
       <EditView ref="editChild" @tableReload="handleTableReload" />
       <div class="table-header">
         <a-input-search v-model:value="searchInput" :placeholder="formatMessage('page.input', '璇疯緭鍏�')"
           style="width: 200px;" @search="onSearch" />
         <div class="table-header-right">
-          <a-button @click="handleEdit(null)" type="primary">{{ formatMessage('page.init', '鍒濆鍖�') }}</a-button>
+          <a-button @click="handleInit(null)" type="primary">{{ formatMessage('page.init', '鍒濆鍖�') }}</a-button>
           <a-button @click="handleEdit(null)" type="primary">{{ formatMessage('page.add', '娣诲姞') }}</a-button>
           <a-button @click="handleExport">{{ formatMessage('page.export', '瀵煎嚭') }}</a-button>
         </div>
diff --git a/zy-asrs-admin/src/views/base/locTypeBind/init.vue b/zy-asrs-admin/src/views/base/locTypeBind/init.vue
new file mode 100644
index 0000000..174aa9d
--- /dev/null
+++ b/zy-asrs-admin/src/views/base/locTypeBind/init.vue
@@ -0,0 +1,137 @@
+<script setup>
+import { ref, nextTick } from 'vue';
+import { get, post, postBlob, postForm } from '@/utils/request.js'
+import { formatMessage } from '@/utils/localeUtils.js';
+import { message } from 'ant-design-vue';
+
+const formTable = ref(null);
+const submitButton = ref(null);
+const isSave = ref(true);
+const open = ref(false);
+const initFormData = {}
+let formData = ref(initFormData);
+
+const emit = defineEmits(['tableReload'])
+
+const handleOk = (e) => {
+    nextTick(() => {
+        setTimeout(() => {
+            submitButton.value.$el.click();
+        }, 100);
+    });
+};
+
+const onFinish = values => {
+    // console.log('Success:', values);
+    open.value = false;
+    post('/api/locTypeBind/init', formData.value).then((resp) => {
+        let result = resp.data;
+        if (result.code === 200) {
+            message.success(formatMessage('page.add.success', '鍒濆鍖栨垚鍔�'));
+        } else {
+            message.error(result.msg);
+        }
+        emit('tableReload', 'reload')
+        nextTick(() => {
+            formTable.value.resetFields()
+        })
+    })
+};
+const onFinishFailed = errorInfo => {
+    console.log('Failed:', errorInfo);
+};
+
+const locQueryList = ref(null);
+locQuery();
+function locQuery() {
+    postForm('/api/loc/query', {}).then(resp => {
+        let result = resp.data;
+        locQueryList.value = result.data;
+    })
+}
+const locTypeQueryList = ref(null);
+locTypeQuery();
+function locTypeQuery() {
+    post('/api/locType/tree', {}).then(resp => {
+        let result = resp.data;
+        locTypeQueryList.value = result.data;
+    })
+}
+const userQueryList = ref(null);
+userQuery();
+function userQuery() {
+    postForm('/api/user/query', {}).then(resp => {
+        let result = resp.data;
+        userQueryList.value = result.data;
+    })
+}
+
+
+defineExpose({
+    open,
+})
+
+</script>
+
+<script>
+export default {
+    name: '搴撲綅绫诲瀷缁戝畾-init'
+}
+</script>
+
+<template>
+    <div>
+        <a-modal v-model:open="open" :title="formatMessage('page.init', '鍒濆鍖�')" @ok="handleOk" style="width: 600px;">
+            <a-form :model="formData" ref="formTable" name="formTable" :label-col="{ span: 8 }"
+                :wrapper-col="{ span: 16 }" style="display: flex;justify-content: space-between;flex-wrap: wrap;"
+                autocomplete="off" @finish="onFinish" @finishFailed="onFinishFailed">
+                <a-form-item :label="formatMessage('db.man_loc_area_type.type_id', '搴撲綅绫诲瀷')" name="typeId"
+                    style="width: 250px;" :rules="[{ required: true }]">
+                    <a-tree-select v-model:value="formData.typeId" show-search style="width: 100%"
+                        :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
+                        :placeholder="formatMessage('page.input', '璇疯緭鍏�')" allow-clea tree-data-simple-mode
+                        :tree-data="locTypeQueryList" tree-node-filter-prop="name" :field-names="{
+                            children: 'children',
+                            label: 'name',
+                            value: 'id',
+                        }">
+                        <template #title="{ value: id, name }">
+                            {{ name }}
+                        </template>
+                    </a-tree-select>
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_loc_area_type.start_row', '璧峰鎺�')" name="startRow"
+                    style="width: 250px;" :rules="[{ required: true }]">
+                    <a-input v-model:value="formData.startRow" />
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_loc_area_type.target_row', '缁撴潫鎺�')" name="targetRow"
+                    style="width: 250px;" :rules="[{ required: true }]">
+                    <a-input v-model:value="formData.targetRow" />
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_loc_area_type.start_bay', '璧峰鍒�')" name="startBay"
+                    style="width: 250px;" :rules="[{ required: true }]">
+                    <a-input v-model:value="formData.startBay" />
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_loc_area_type.target_bay', '缁撴潫鍒�')" name="targetBay"
+                    style="width: 250px;" :rules="[{ required: true }]">
+                    <a-input v-model:value="formData.targetBay" />
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_loc_area_type.start_lev', '璧峰灞�')" name="startLev"
+                    style="width: 250px;" :rules="[{ required: true }]">
+                    <a-input v-model:value="formData.startLev" />
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_loc_area_type.target_lev', '缁撴潫灞�')" name="targetLev"
+                    style="width: 250px;" :rules="[{ required: true }]">
+                    <a-input v-model:value="formData.targetLev" />
+                </a-form-item>
+
+                <a-form-item>
+                    <a-button type="primary" html-type="submit" ref="submitButton"
+                        style="visibility: hidden;">Submit</a-button>
+                </a-form-item>
+            </a-form>
+        </a-modal>
+    </div>
+</template>
+
+<style></style>
diff --git a/zy-asrs-admin/src/views/loc/loc/index.vue b/zy-asrs-admin/src/views/loc/loc/index.vue
index da53d69..5d3d7c3 100644
--- a/zy-asrs-admin/src/views/loc/loc/index.vue
+++ b/zy-asrs-admin/src/views/loc/loc/index.vue
@@ -229,7 +229,6 @@
 }
 
 const showDetl = (record) => {
-  console.log(record);
   locDetlShowChild.value.open = true;
   locDetlShowChild.value.locId = record.id;
 }
diff --git a/zy-asrs-admin/src/views/loc/locMap/edit.vue b/zy-asrs-admin/src/views/loc/locMap/edit.vue
new file mode 100644
index 0000000..eeafd43
--- /dev/null
+++ b/zy-asrs-admin/src/views/loc/locMap/edit.vue
@@ -0,0 +1,128 @@
+<script setup>
+import { ref, nextTick } from 'vue';
+import { get, post, postBlob, postForm } from '@/utils/request.js'
+import { formatMessage } from '@/utils/localeUtils.js';
+import { message } from 'ant-design-vue';
+
+const formTable = ref(null);
+const submitButton = ref(null);
+const isSave = ref(true);
+const open = ref(false);
+const initFormData = {}
+let formData = ref(initFormData);
+
+const emit = defineEmits(['tableReload'])
+
+const handleOk = (e) => {
+    nextTick(() => {
+        setTimeout(() => {
+            submitButton.value.$el.click();
+        }, 100);
+    });
+};
+
+const onFinish = values => {
+    // console.log('Success:', values);
+    open.value = false;
+    post(isSave.value ? '/api/locMap/save' : '/api/locMap/update', formData.value).then((resp) => {
+        let result = resp.data;
+        if (result.code === 200) {
+            message.success(isSave.value ? formatMessage('page.add.success', '鏂板鎴愬姛') : formatMessage('page.update.success', '鏇存柊鎴愬姛'));
+        } else {
+            message.error(result.msg);
+        }
+        emit('tableReload', 'reload')
+        nextTick(() => {
+            formTable.value.resetFields()
+        })
+    })
+};
+const onFinishFailed = errorInfo => {
+    console.log('Failed:', errorInfo);
+};
+
+const userQueryList = ref(null);
+userQuery();
+function userQuery() {
+    postForm('/api/user/query', {}).then(resp => {
+        let result = resp.data;
+        userQueryList.value = result.data;
+    })
+}
+
+
+defineExpose({
+    open,
+    formData,
+    initFormData,
+    isSave,
+})
+
+</script>
+
+<script>
+export default {
+    name: '搴撲綅鍦板浘-edit'
+}
+</script>
+
+<template>
+    <div>
+        <a-modal v-model:open="open"
+            :title="isSave ? formatMessage('page.add', '娣诲姞') : formatMessage('page.edit', '缂栬緫')" @ok="handleOk"
+            style="width: 600px;">
+            <a-form :model="formData" ref="formTable" name="formTable" :label-col="{ span: 8 }"
+                :wrapper-col="{ span: 16 }" style="display: flex;justify-content: space-between;flex-wrap: wrap;"
+                autocomplete="off" @finish="onFinish" @finishFailed="onFinishFailed">
+                <a-form-item :label="formatMessage('db.man_loc_map.data', '鍦板浘鏁版嵁')" name="data" style="width: 250px;">
+                    <a-input v-model:value="formData.data" />
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_loc_map.map_lev', '鍦板浘妤煎眰')" name="mapLev"
+                    style="width: 250px;">
+                    <a-input v-model:value="formData.mapLev" />
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_loc_map.status', '鐘舵��')" name="status" style="width: 250px;">
+                    <a-select v-model:value="formData.status" :options="[
+                        { label: '姝e父', value: 1 },
+                        { label: '绂佺敤', value: 0 },
+                    ]">
+                    </a-select>
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_loc_map.create_time', '娣诲姞鏃堕棿')" name="createTime"
+                    style="width: 250px;">
+                    <a-date-picker v-model:value="formData.createTime" show-time format="YYYY-MM-DD HH:mm:ss"
+                        value-format="YYYY-MM-DD HH:mm:ss" />
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_loc_map.create_by', '娣诲姞浜哄憳')" name="createBy"
+                    style="width: 250px;">
+                    <a-select v-model:value="formData.createBy" :placeholder="formatMessage('common.select', '璇烽�夋嫨')"
+                        style="width: 100%" show-search :options="userQueryList" optionFilterProp="label"
+                        optionLabelProp="label">
+                    </a-select>
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_loc_map.update_time', '淇敼鏃堕棿')" name="updateTime"
+                    style="width: 250px;">
+                    <a-date-picker v-model:value="formData.updateTime" show-time format="YYYY-MM-DD HH:mm:ss"
+                        value-format="YYYY-MM-DD HH:mm:ss" />
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_loc_map.update_by', '淇敼浜哄憳')" name="updateBy"
+                    style="width: 250px;">
+                    <a-select v-model:value="formData.updateBy" :placeholder="formatMessage('common.select', '璇烽�夋嫨')"
+                        style="width: 100%" show-search :options="userQueryList" optionFilterProp="label"
+                        optionLabelProp="label">
+                    </a-select>
+                </a-form-item>
+                <a-form-item :label="formatMessage('db.man_loc_map.memo', '澶囨敞')" name="memo" style="width: 250px;">
+                    <a-input v-model:value="formData.memo" />
+                </a-form-item>
+
+                <a-form-item>
+                    <a-button type="primary" html-type="submit" ref="submitButton"
+                        style="visibility: hidden;">Submit</a-button>
+                </a-form-item>
+            </a-form>
+        </a-modal>
+    </div>
+</template>
+
+<style></style>
diff --git a/zy-asrs-admin/src/views/loc/locMap/index.vue b/zy-asrs-admin/src/views/loc/locMap/index.vue
new file mode 100644
index 0000000..2930318
--- /dev/null
+++ b/zy-asrs-admin/src/views/loc/locMap/index.vue
@@ -0,0 +1,54 @@
+<script setup>
+import { getCurrentInstance, ref, computed, reactive } from 'vue';
+import { useRouter } from "vue-router";
+import { get, post, postBlob } from '@/utils/request.js'
+import { message, Modal } from 'ant-design-vue';
+import { logout } from '@/config.js';
+import { formatMessage } from '@/utils/localeUtils.js';
+import MapView from '@/components/loc/map/index.vue'
+import LocMapView from './locMap.vue'
+import {
+    FormOutlined,
+    CameraOutlined,
+} from "@ant-design/icons-vue";
+
+const currentPage = ref("map")
+
+const switchPage = () => {
+    let tmp = ''
+    if (currentPage.value == 'map') {
+        tmp = 'locMap'
+    }
+    if (currentPage.value == 'locMap') {
+        tmp = 'map'
+    }
+    currentPage.value = tmp;
+}
+
+</script>
+
+<script>
+export default {
+    name: '搴撲綅鍦板浘'
+}
+</script>
+
+<template>
+    <a-float-button :style="{
+        right: '24px',
+        bottom: '100px'
+    }" @click="switchPage()">
+        <template #icon>
+            <div v-if="currentPage == 'map'">
+                <FormOutlined />
+            </div>
+            <div v-else>
+                <CameraOutlined />
+            </div>
+        </template>
+    </a-float-button>
+    <MapView v-if="currentPage == 'map'" />
+    <LocMapView v-else />
+</template>
+
+<style></style>
diff --git a/zy-asrs-admin/src/views/loc/locMap/locMap.vue b/zy-asrs-admin/src/views/loc/locMap/locMap.vue
new file mode 100644
index 0000000..a6a152a
--- /dev/null
+++ b/zy-asrs-admin/src/views/loc/locMap/locMap.vue
@@ -0,0 +1,250 @@
+<script setup>
+import { getCurrentInstance, ref, computed, reactive } from 'vue';
+import { useRouter } from "vue-router";
+import { get, post, postBlob } from '@/utils/request.js'
+import { message, Modal } from 'ant-design-vue';
+import { logout } from '@/config.js';
+import EditView from './edit.vue'
+import { formatMessage } from '@/utils/localeUtils.js';
+import useTableSearch from '@/utils/tableUtils.jsx';
+const context = getCurrentInstance()?.appContext.config.globalProperties;
+
+const router = useRouter();
+
+const TABLE_KEY = 'table-locMap';
+let currentPage = 1;
+let pageSize = 10;
+const searchInput = ref("")
+const editChild = ref(null)
+
+let tableData = ref([]);
+getPage();
+
+const {
+  getColumnSearchProps,
+  handleResizeColumn,
+} = useTableSearch();
+
+const columns = [
+  {
+    title: formatMessage('db.man_loc_map.data', '鍦板浘鏁版嵁'),
+    dataIndex: 'data',
+    width: 140,
+    ellipsis: true,
+    ...getColumnSearchProps('data'),
+  },
+  {
+    title: formatMessage('db.man_loc_map.map_lev', '鍦板浘妤煎眰'),
+    dataIndex: 'mapLev',
+    width: 140,
+    ellipsis: true,
+    ...getColumnSearchProps('mapLev'),
+  },
+  {
+    title: formatMessage('db.man_loc_map.status', '鐘舵��'),
+    dataIndex: 'status$',
+    width: 140,
+    ellipsis: true,
+    ...getColumnSearchProps('status$'),
+  },
+  {
+    title: formatMessage('db.man_loc_map.create_time', '娣诲姞鏃堕棿'),
+    dataIndex: 'createTime$',
+    width: 140,
+    ellipsis: true,
+    ...getColumnSearchProps('createTime$'),
+  },
+  {
+    title: formatMessage('db.man_loc_map.create_by', '娣诲姞浜哄憳'),
+    dataIndex: 'createBy$',
+    width: 140,
+    ellipsis: true,
+    ...getColumnSearchProps('createBy$'),
+  },
+  {
+    title: formatMessage('db.man_loc_map.update_time', '淇敼鏃堕棿'),
+    dataIndex: 'updateTime$',
+    width: 140,
+    ellipsis: true,
+    ...getColumnSearchProps('updateTime$'),
+  },
+  {
+    title: formatMessage('db.man_loc_map.update_by', '淇敼浜哄憳'),
+    dataIndex: 'updateBy$',
+    width: 140,
+    ellipsis: true,
+    ...getColumnSearchProps('updateBy$'),
+  },
+  {
+    title: formatMessage('db.man_loc_map.memo', '澶囨敞'),
+    dataIndex: 'memo',
+    width: 140,
+    ellipsis: true,
+    ...getColumnSearchProps('memo'),
+  },
+
+  {
+    title: formatMessage('common.operation', '鎿嶄綔'),
+    name: 'oper',
+    dataIndex: 'oper',
+    key: 'oper',
+    width: 240,
+    fixed: 'right',
+  },
+];
+
+const state = reactive({
+  selectedRowKeys: [],
+  loading: false,
+});
+const hasSelected = computed(() => state.selectedRowKeys.length > 0);
+const start = () => {
+  state.loading = true;
+  // ajax request after empty completing
+  setTimeout(() => {
+    state.loading = false;
+    state.selectedRowKeys = [];
+  }, 1000);
+};
+const onSelectChange = selectedRowKeys => {
+  // console.log('selectedRowKeys changed: ', selectedRowKeys);
+  state.selectedRowKeys = selectedRowKeys;
+};
+
+function getPage() {
+  post('/api/locMap/page', {
+    current: currentPage,
+    pageSize: pageSize,
+    condition: searchInput.value
+  }).then((resp) => {
+    let result = resp.data;
+    if (result.code == 200) {
+      let data = result.data;
+      tableData.value = data;
+    } else if (result.code === 401) {
+      message.error(result.msg);
+      logout()
+    } else {
+      message.error(result.msg);
+    }
+  })
+}
+
+const handleInit = (item) => {
+  Modal.confirm({
+    title: formatMessage('page.locMap.confirm.title', '鍒濆鍖�'),
+    content: formatMessage('page.locMap.confirm', '纭畾鍒濆鍖栧簱浣嶅悧锛�'),
+    maskClosable: true,
+    onOk: async () => {
+      const hide = message.loading(formatMessage('common.loading', '璇锋眰涓�'));
+      try {
+        post('/api/locMap/init', item).then(resp => {
+          let result = resp.data;
+          if (result.code === 200) {
+            message.success(result.msg);
+          } else {
+            message.error(result.msg);
+          }
+          getPage()
+          hide()
+        })
+      } catch (error) {
+        message.error(formatMessage('common.fail', '璇锋眰澶辫触'));
+      }
+    },
+  });
+}
+
+const handleEdit = (item) => {
+  editChild.value.open = true;
+  editChild.value.formData = item == null ? editChild.value.initFormData : JSON.parse(JSON.stringify(item));
+  editChild.value.isSave = item == null;
+}
+
+const handleDel = (rows) => {
+  Modal.confirm({
+    title: formatMessage('page.delete', '鍒犻櫎'),
+    content: formatMessage('page.delete.confirm', '纭畾鍒犻櫎璇ラ」鍚楋紵'),
+    maskClosable: true,
+    onOk: async () => {
+      const hide = message.loading(formatMessage('common.loading', '璇锋眰涓�'));
+      try {
+        post('/api/locMap/remove/' + rows.map((row) => row.id).join(','), {}).then(resp => {
+          let result = resp.data;
+          if (result.code === 200) {
+            message.success(result.msg);
+          } else {
+            message.error(result.msg);
+          }
+          getPage()
+          hide()
+        })
+      } catch (error) {
+        message.error(formatMessage('common.fail', '璇锋眰澶辫触'));
+      }
+    },
+  });
+}
+
+const handleExport = async (intl) => {
+  postBlob('/api/locMap/export', {}).then(result => {
+    const blob = new Blob([result.data], { type: 'application/vnd.ms-excel' });
+    window.location.href = window.URL.createObjectURL(blob);
+    return true;
+  })
+};
+
+const onSearch = () => {
+  // console.log('search');
+  getPage()
+}
+
+const onPageChange = (page, size) => {
+  currentPage = page;
+  pageSize = size;
+  getPage();
+}
+
+function handleTableReload(value) {
+  getPage()
+}
+
+</script>
+
+<script>
+export default {
+  name: '搴撲綅鍦板浘'
+}
+</script>
+
+<template>
+  <div>
+    <EditView ref="editChild" @tableReload="handleTableReload" />
+    <div class="table-header">
+      <a-input-search v-model:value="searchInput" :placeholder="formatMessage('page.input', '璇疯緭鍏�')"
+        style="width: 200px;" @search="onSearch" />
+      <div class="table-header-right">
+        <a-button @click="handleEdit(null)" type="primary">{{ formatMessage('page.add', '娣诲姞') }}</a-button>
+        <a-button @click="handleExport">{{ formatMessage('page.export', '瀵煎嚭') }}</a-button>
+      </div>
+    </div>
+    <a-table :row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }"
+      :data-source="tableData.records" :defaultExpandAllRows="false" :key="TABLE_KEY" rowKey="id"
+      :pagination="{ total: tableData.total, onChange: onPageChange }"
+      :scroll="{ y: 768, scrollToFirstRowOnChange: true }" :columns="columns" @resizeColumn="handleResizeColumn">
+      <template #bodyCell="{ column, text, record }">
+        <template v-if="column.dataIndex === 'oper'">
+          <div style="display: flex;justify-content: space-evenly;">
+            <a-button type="link" primary @click="handleInit(record)">{{ formatMessage('page.locMap.init', '鍒濆鍖栧簱浣�')
+              }}</a-button>
+            <a-button type="link" primary @click="handleEdit(record)">{{ formatMessage('page.edit', '缂栬緫') }}</a-button>
+            <a-button type="link" danger @click="handleDel([record])">{{ formatMessage('page.delete', '鍒犻櫎')
+              }}</a-button>
+          </div>
+        </template>
+      </template>
+    </a-table>
+  </div>
+</template>
+
+<style></style>
diff --git a/zy-asrs-admin/src/views/system/language/edit.vue b/zy-asrs-admin/src/views/system/language/edit.vue
index 2c8c266..be70201 100644
--- a/zy-asrs-admin/src/views/system/language/edit.vue
+++ b/zy-asrs-admin/src/views/system/language/edit.vue
@@ -77,8 +77,8 @@
                 <a-form-item :label="formatMessage('db.sys_language.locale', '鍦板尯')" name="locale"
                     style="width: 250px;">
                     <a-select v-model:value="formData.locale" :options="[
-                        { label: '绠�浣撲腑鏂�', value: 'zhCN' },
-                        { label: 'English', value: 'enUS' },
+                        { label: '绠�浣撲腑鏂�', value: 'zh_CN' },
+                        { label: '鑻辫', value: 'en_US' },
                     ]">
                     </a-select>
                 </a-form-item>
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java
index 94ebbef..c196ef8 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java
@@ -9,6 +9,7 @@
 import com.zy.asrs.wms.asrs.entity.*;
 import com.zy.asrs.wms.asrs.mapper.LocDetlMapper;
 import com.zy.asrs.wms.asrs.service.LocDetlFieldService;
+import com.zy.asrs.wms.asrs.service.LocService;
 import com.zy.asrs.wms.asrs.service.MatFieldService;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
@@ -28,6 +29,8 @@
 @RequestMapping("/api")
 public class LocDetlController extends BaseController {
 
+    @Autowired
+    private LocService locService;
     @Autowired
     private LocDetlService locDetlService;
     @Autowired
@@ -75,6 +78,18 @@
     }
 
     @PreAuthorize("hasAuthority('asrs:locDetl:list')")
+    @GetMapping("/locDetl/locNo/{locNo}")
+    public R list(@PathVariable("locNo") String locNo) {
+        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, locNo));
+        if (loc == null) {
+            return R.error("搴撲綅涓嶅瓨鍦�");
+        }
+        List<LocDetl> list = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocId, loc.getId()));
+        List<LocDetl> locDetls = locDetlService.parseLocDetl(list);
+        return R.ok().add(locDetls);
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locDetl:list')")
     @GetMapping("/locDetl/{id}")
     public R get(@PathVariable("id") Long id) {
         return R.ok().add(locDetlService.getById(id));
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocMapController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocMapController.java
new file mode 100644
index 0000000..27ff99c
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocMapController.java
@@ -0,0 +1,182 @@
+package com.zy.asrs.wms.asrs.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.asrs.entity.Loc;
+import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
+import com.zy.asrs.wms.asrs.service.LocService;
+import com.zy.asrs.wms.common.annotation.OperationLog;
+import com.zy.asrs.wms.common.domain.BaseParam;
+import com.zy.asrs.wms.common.domain.KeyValVo;
+import com.zy.asrs.wms.common.domain.PageParam;
+import com.zy.asrs.wms.asrs.entity.LocMap;
+import com.zy.asrs.wms.asrs.service.LocMapService;
+import com.zy.asrs.wms.system.controller.BaseController;
+import com.zy.asrs.wms.utils.ExcelUtil;
+import com.zy.asrs.wms.utils.Utils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api")
+public class LocMapController extends BaseController {
+
+    @Autowired
+    private LocMapService locMapService;
+    @Autowired
+    private LocService locService;
+
+    @PreAuthorize("hasAuthority('asrs:locMap:list')")
+    @PostMapping("/locMap/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<LocMap, BaseParam> pageParam = new PageParam<>(baseParam, LocMap.class);
+        return R.ok().add(locMapService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locMap:list')")
+    @PostMapping("/locMap/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(locMapService.list());
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locMap:list')")
+    @GetMapping("/locMap/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(locMapService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locMap:save')")
+    @OperationLog("娣诲姞搴撲綅鍦板浘")
+    @PostMapping("/locMap/save")
+    public R save(@RequestBody LocMap locMap) {
+        if (!locMapService.save(locMap)) {
+            return R.error("娣诲姞澶辫触");
+        }
+        return R.ok("娣诲姞鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locMap:update')")
+    @OperationLog("淇敼搴撲綅鍦板浘")
+    @PostMapping("/locMap/update")
+    public R update(@RequestBody LocMap locMap) {
+        if (!locMapService.updateById(locMap)) {
+            return R.error("淇敼澶辫触");
+        }
+        return R.ok("淇敼鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locMap:remove')")
+    @OperationLog("鍒犻櫎搴撲綅鍦板浘")
+    @PostMapping("/locMap/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!locMapService.removeByIds(Arrays.asList(ids))) {
+            return R.error("鍒犻櫎澶辫触");
+        }
+        return R.ok("鍒犻櫎鎴愬姛");
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locMap:list')")
+    @PostMapping("/locMap/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<LocMap> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(LocMap::getId, condition);
+        }
+        locMapService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locMap:list')")
+    @PostMapping("/locMap/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(locMapService.list(), LocMap.class), response);
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locMap:list')")
+    @GetMapping("/locMap/getData/{lev}/auth")
+    public R getMapData(@PathVariable("lev") Integer lev) {
+        LocMap locMap = locMapService.getOne(new LambdaQueryWrapper<LocMap>().eq(LocMap::getMapLev, lev));
+        //瑙f瀽json鍦板浘鏁版嵁
+        List<ArrayList> arrayLists = JSON.parseArray(locMap.getData(), ArrayList.class);
+
+        //鑾峰彇褰撳墠妤煎眰搴撲綅鏁版嵁
+        List<Loc> list = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getLev1, lev));
+        for (Loc loc : list) {
+            Integer row = loc.getRow1();
+            Integer bay = loc.getBay1();
+
+            ArrayList rowData = arrayLists.get(row);
+            Object o = rowData.get(bay);
+            JSONObject jsonObject = JSON.parseObject(o.toString());
+            jsonObject.put("locNo", loc.getLocNo());//璁剧疆搴撲綅鍙�
+            jsonObject.put("locSts$", loc.getLocStsId$());//搴撲綅鐘舵�佹弿杩�
+            jsonObject.put("locSts", loc.getLocSts$());//搴撲綅鐘舵��
+            //鏇存柊list
+            rowData.set(bay, jsonObject);
+            arrayLists.set(row, rowData);
+        }
+
+        return R.ok().add(JSONObject.toJSONString(arrayLists));
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locMap:list')")
+    @GetMapping("/locMap/getLev")
+    public R getMapLev() {
+        List<LocMap> list = locMapService.list(new LambdaQueryWrapper<LocMap>().orderByAsc(LocMap::getMapLev));
+        ArrayList<Integer> levList = new ArrayList<>();
+        for (LocMap locMap : list) {
+            levList.add(locMap.getMapLev());
+        }
+        return R.ok().add(levList);
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locMap:save')")
+    @OperationLog("鍒濆鍖栧簱浣�")
+    @PostMapping("/locMap/init")
+    @Transactional
+    public R init(@RequestBody LocMap locMap) {
+        Integer mapLev = locMap.getMapLev();
+
+        locService.remove(new LambdaQueryWrapper<Loc>().eq(Loc::getLev1, mapLev));
+
+        //瑙f瀽json鍦板浘鏁版嵁
+        List<ArrayList> arrayLists = JSON.parseArray(locMap.getData(), ArrayList.class);
+        int rowIdx = 0;
+        for (ArrayList row : arrayLists) {
+            int bayIdx = 0;
+            for (Object bay : row) {
+                JSONObject data = JSON.parseObject(JSON.toJSONString(bay));
+                if (data.getInteger("value") == 0) {
+                    Loc loc = new Loc();
+                    loc.setRow1(rowIdx);
+                    loc.setBay1(bayIdx);
+                    loc.setLev1(mapLev);
+                    loc.setLocStsId(LocStsType.O.val());
+                    loc.setLocNo(Utils.getLocNo(rowIdx, bayIdx, mapLev));
+                    locService.save(loc);
+                }
+                bayIdx++;
+            }
+            rowIdx++;
+        }
+
+        return R.ok("娣诲姞鎴愬姛");
+    }
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocTypeBindController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocTypeBindController.java
index 28a1350..fad5aef 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocTypeBindController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocTypeBindController.java
@@ -4,6 +4,10 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.wms.asrs.entity.Loc;
+import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
+import com.zy.asrs.wms.asrs.entity.param.InitLocTypeBindParam;
+import com.zy.asrs.wms.asrs.service.LocService;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
 import com.zy.asrs.wms.common.domain.KeyValVo;
@@ -14,6 +18,7 @@
 import com.zy.asrs.wms.utils.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
@@ -28,6 +33,8 @@
 
     @Autowired
     private LocTypeBindService locTypeBindService;
+    @Autowired
+    private LocService locService;
 
     @PreAuthorize("hasAuthority('asrs:locTypeBind:list')")
     @PostMapping("/locTypeBind/page")
@@ -50,6 +57,34 @@
     }
 
     @PreAuthorize("hasAuthority('asrs:locTypeBind:save')")
+    @OperationLog("鍒濆鍖栧簱浣嶇被鍨嬬粦瀹�")
+    @PostMapping("/locTypeBind/init")
+    @Transactional
+    public R init(@RequestBody InitLocTypeBindParam param) {
+        LambdaQueryWrapper<Loc> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.ge(Loc::getRow1, param.getStartRow());
+        queryWrapper.le(Loc::getRow1, param.getTargetRow());
+        queryWrapper.ge(Loc::getBay1, param.getStartBay());
+        queryWrapper.le(Loc::getBay1, param.getTargetBay());
+        queryWrapper.ge(Loc::getLev1, param.getStartLev());
+        queryWrapper.le(Loc::getLev1, param.getTargetLev());
+
+        List<Loc> list = locService.list(queryWrapper);
+        if (list.isEmpty()) {
+            return R.error("鏈壘鍒板簱浣嶄俊鎭�");
+        }
+
+        for (Loc loc : list) {
+            LocTypeBind locTypeBind = new LocTypeBind();
+            locTypeBind.setLocId(loc.getId());
+            locTypeBind.setTypeId(param.getTypeId());
+            locTypeBindService.save(locTypeBind);
+        }
+
+        return R.ok("鍒濆鍖栨垚鍔�");
+    }
+
+    @PreAuthorize("hasAuthority('asrs:locTypeBind:save')")
     @OperationLog("娣诲姞搴撲綅绫诲瀷缁戝畾")
     @PostMapping("/locTypeBind/save")
     public R save(@RequestBody LocTypeBind locTypeBind) {
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LanewayRule.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LanewayRule.java
index 2939aae..6b39ea5 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LanewayRule.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LanewayRule.java
@@ -3,7 +3,7 @@
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.util.*;
 
 import com.zy.asrs.wms.system.entity.Host;
 import com.zy.asrs.wms.system.entity.User;
@@ -26,7 +26,6 @@
 
 import java.io.Serializable;
 import java.util.Date;
-import java.util.List;
 
 @Data
 @TableName("strategy_laneway_rule")
@@ -139,19 +138,25 @@
 //    );
 
     public List<Integer> getLaneX$() {
-        if (null == this.laneX){ return null; }
+        if (null == this.laneX){ return new ArrayList<>(); }
+        if (Cools.isEmpty(this.laneX)) {
+            return new ArrayList<>();
+        }
         List<Integer> list = JSON.parseArray(this.laneX, Integer.class);
         if (list.isEmpty()) {
-            return null;
+            return new ArrayList<>();
         }
         return list;
     }
 
     public List<Integer> getLaneY$() {
-        if (null == this.laneY){ return null; }
+        if (null == this.laneY){ return new ArrayList<>(); }
+        if (Cools.isEmpty(this.laneY)) {
+            return new ArrayList<>();
+        }
         List<Integer> list = JSON.parseArray(this.laneY, Integer.class);
         if (list.isEmpty()) {
-            return null;
+            return new ArrayList<>();
         }
         return list;
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Loc.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Loc.java
index fa437b3..f9c15e8 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Loc.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Loc.java
@@ -103,7 +103,6 @@
      * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
      */
     @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
-    @TableLogic
     private Integer deleted;
 
     /**
@@ -187,6 +186,15 @@
         return null;
     }
 
+    public String getLocSts$(){
+        LocStsService service = SpringUtils.getBean(LocStsService.class);
+        LocSts locSts = service.getById(this.locStsId);
+        if (!Cools.isEmpty(locSts)){
+            return String.valueOf(locSts.getLocSts());
+        }
+        return null;
+    }
+
     public String getHostId$(){
         HostService service = SpringUtils.getBean(HostService.class);
         Host host = service.getById(this.hostId);
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java
index 7472fb6..f7cb142 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java
@@ -6,9 +6,11 @@
 import java.text.SimpleDateFormat;
 import java.util.*;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fasterxml.jackson.annotation.JsonAnyGetter;
 import com.zy.asrs.common.utils.Synchro;
 import com.zy.asrs.wms.asrs.service.LocService;
+import com.zy.asrs.wms.asrs.service.MatFieldService;
 import com.zy.asrs.wms.asrs.service.MatService;
 import com.zy.asrs.wms.system.entity.Host;
 import com.zy.asrs.wms.system.entity.User;
@@ -316,4 +318,23 @@
         dynamicFields.put(key, value);
     }
 
+    public List<Map<String, Object>> getDynamicFieldsList() {
+        MatFieldService service = SpringUtils.getBean(MatFieldService.class);
+        List<MatField> matFields = service.list(new LambdaQueryWrapper<MatField>().eq(MatField::getFieldType, 1));
+        HashMap<String, Object> fieldMap = new HashMap<>();
+        for (MatField matField : matFields) {
+            fieldMap.put(matField.getName(), matField.getDescribe());
+        }
+
+        List<Map<String, Object>> list = new ArrayList<>();
+        for (Map.Entry<String, Object> entry : dynamicFields.entrySet()) {
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("key", entry.getKey());
+            map.put("value", entry.getValue());
+            map.put("desc", fieldMap.get(entry.getKey()));
+            list.add(map);
+        }
+        return list;
+    }
+
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocMap.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocMap.java
new file mode 100644
index 0000000..3fb9a86
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocMap.java
@@ -0,0 +1,203 @@
+package com.zy.asrs.wms.asrs.entity;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.zy.asrs.wms.system.entity.Host;
+import com.zy.asrs.wms.system.entity.User;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.wms.system.service.UserService;
+import com.zy.asrs.wms.system.service.HostService;
+import com.zy.asrs.common.utils.Synchro;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("man_loc_map")
+public class LocMap implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鍦板浘鏁版嵁
+     */
+    @ApiModelProperty(value= "鍦板浘鏁版嵁")
+    private String data;
+
+    /**
+     * 鍦板浘妤煎眰
+     */
+    @ApiModelProperty(value= "鍦板浘妤煎眰")
+    private Integer mapLev;
+
+    /**
+     * 鎵�灞炴満鏋�
+     */
+    @ApiModelProperty(value= "鎵�灞炴満鏋�")
+    private Long hostId;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
+    private Integer status;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    @TableLogic
+    private Integer deleted;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public LocMap() {}
+
+    public LocMap(String data,Integer mapLev,Long hostId,Integer status,Integer deleted,Date createTime,Long createBy,Date updateTime,Long updateBy,String memo) {
+        this.data = data;
+        this.mapLev = mapLev;
+        this.hostId = hostId;
+        this.status = status;
+        this.deleted = deleted;
+        this.createTime = createTime;
+        this.createBy = createBy;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.memo = memo;
+    }
+
+//    LocMap locMap = new LocMap(
+//            null,    // 鍦板浘鏁版嵁
+//            null,    // 鍦板浘妤煎眰
+//            null,    // 鎵�灞炴満鏋�
+//            null,    // 鐘舵��
+//            null,    // 鏄惁鍒犻櫎
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null    // 澶囨敞
+//    );
+
+    public String getHostId$(){
+        HostService service = SpringUtils.getBean(HostService.class);
+        Host host = service.getById(this.hostId);
+        if (!Cools.isEmpty(host)){
+            return String.valueOf(host.getName());
+        }
+        return null;
+    }
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "姝e父";
+            case 0:
+                return "绂佺敤";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public String getDeleted$(){
+        if (null == this.deleted){ return null; }
+        switch (this.deleted){
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.deleted);
+        }
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getCreateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.createBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    public String getUpdateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.updateBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+
+
+    public void sync(Object source) {
+        Synchro.Copy(source, this);
+    }
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/enums/ShelvesRuleDetlType.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/enums/ShelvesRuleDetlType.java
new file mode 100644
index 0000000..4ae473b
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/enums/ShelvesRuleDetlType.java
@@ -0,0 +1,19 @@
+package com.zy.asrs.wms.asrs.entity.enums;
+
+public enum ShelvesRuleDetlType {
+
+    TASK_OR_LOC(1, "搴撳瓨鎴栦换鍔′腑鍖归厤鐩搁偦搴撲綅"),
+    SUGGEST(2, "鎺ㄨ崘鍖哄煙"),
+    COMPLETE(3, "瀹屾暣宸烽亾"),
+    ;
+
+
+    public Integer id;
+    public String desc;
+
+    ShelvesRuleDetlType(Integer id, String desc) {
+        this.id = id;
+        this.desc = desc;
+    }
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/InitLocTypeBindParam.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/InitLocTypeBindParam.java
new file mode 100644
index 0000000..b7be0ac
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/InitLocTypeBindParam.java
@@ -0,0 +1,43 @@
+package com.zy.asrs.wms.asrs.entity.param;
+
+import lombok.Data;
+
+@Data
+public class InitLocTypeBindParam {
+
+    /**
+     * 搴撲綅绫诲瀷
+     */
+    private Long typeId;
+
+    /**
+     * 璧峰鎺�
+     */
+    private Integer startRow;
+
+    /**
+     * 缁撴潫鎺�
+     */
+    private Integer targetRow;
+
+    /**
+     * 璧峰鍒�
+     */
+    private Integer startBay;
+
+    /**
+     * 缁撴潫鍒�
+     */
+    private Integer targetBay;
+
+    /**
+     * 璧峰灞�
+     */
+    private Integer startLev;
+
+    /**
+     * 缁撴潫灞�
+     */
+    private Integer targetLev;
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocMapMapper.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocMapMapper.java
new file mode 100644
index 0000000..a8ba43d
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocMapMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wms.asrs.mapper;
+
+import com.zy.asrs.wms.asrs.entity.LocMap;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface LocMapMapper extends BaseMapper<LocMap> {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocMapService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocMapService.java
new file mode 100644
index 0000000..d62ca60
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocMapService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.wms.asrs.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.asrs.wms.asrs.entity.LocMap;
+
+public interface LocMapService extends IService<LocMap> {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CircleRuleServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CircleRuleServiceImpl.java
index 6e93a17..62f7cd9 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CircleRuleServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CircleRuleServiceImpl.java
@@ -26,13 +26,11 @@
         Integer currentValue = circleRule.getCurrentValue();
         Integer startValue = circleRule.getStartValue();
         Integer targetValue = circleRule.getTargetValue();
-        if (currentValue > targetValue) {
-            currentValue = startValue;
-        }else {
-            currentValue += 1;
-        }
 
-        circleRule.setCurrentValue(currentValue);
+        circleRule.setCurrentValue(currentValue + 1);
+        if (circleRule.getCurrentValue() > targetValue) {
+            circleRule.setCurrentValue(startValue);
+        }
         this.updateById(circleRule);
         return currentValue;
     }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocMapServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocMapServiceImpl.java
new file mode 100644
index 0000000..c12a942
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocMapServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wms.asrs.service.impl;
+
+import com.zy.asrs.wms.asrs.mapper.LocMapMapper;
+import com.zy.asrs.wms.asrs.entity.LocMap;
+import com.zy.asrs.wms.asrs.service.LocMapService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("locMapService")
+public class LocMapServiceImpl extends ServiceImpl<LocMapMapper, LocMap> implements LocMapService {
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
index 1c6c199..1c1748b 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
@@ -3,8 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zy.asrs.framework.exception.CoolException;
 import com.zy.asrs.wms.asrs.entity.*;
-import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
-import com.zy.asrs.wms.asrs.entity.enums.OrderSettleType;
+import com.zy.asrs.wms.asrs.entity.enums.*;
 import com.zy.asrs.wms.asrs.entity.param.GeneratePakInParam;
 import com.zy.asrs.wms.asrs.service.*;
 import com.zy.asrs.wms.utils.LocUtils;
@@ -45,6 +44,12 @@
     private TaskDetlFieldLogService taskDetlFieldLogService;
     @Autowired
     private LocUtils locUtils;
+    @Autowired
+    private ShelvesRuleService shelvesRuleService;
+    @Autowired
+    private LanewayRuleService lanewayRuleService;
+    @Autowired
+    private CircleRuleService circleRuleService;
 
     @Override
     public String generateTaskNo(Long taskType) {
@@ -60,31 +65,68 @@
 
     @Override
     public Loc generateEmptyLoc(Long taskType, Integer locTypeHeight) {
-        Loc defaultLoc = null;
-
-        //1.浠庡簱瀛樻垨浠诲姟涓尮閰嶇浉閭诲簱浣�
-        defaultLoc = locUtils.getNeighborEmptyLoc(taskType, locTypeHeight);
-        if (defaultLoc != null) {
-            return defaultLoc;
+        List<ShelvesRule> shelvesRules = shelvesRuleService.list(new LambdaQueryWrapper<ShelvesRule>().eq(ShelvesRule::getStatus, 1).orderByDesc(ShelvesRule::getCreateTime));
+        if(shelvesRules.isEmpty()) {
+            throw new CoolException("鏈厤缃笂鏋惰鍒�");
         }
-
-        //2.鑾峰彇鎺ㄨ崘搴撲綅
-        List<Loc> suggestLoc = locUtils.getSuggestEmptyLoc(taskType, locTypeHeight);
-        //鑾峰彇搴撲綅
-        if (!suggestLoc.isEmpty()) {
-            defaultLoc = locUtils.filterLoc(taskType, suggestLoc);
-            if(defaultLoc != null) {
-                return defaultLoc;
+        ShelvesRule shelvesRule = shelvesRules.get(0);
+        //鍙敤宸烽亾
+        List<Long> laneList = shelvesRule.getLaneList();
+        //鍙敤宸烽亾Row
+        List<Integer> laneRowList = new ArrayList<>();
+        if (laneList != null) {
+            //鑾峰彇宸烽亾
+            List<LanewayRule> lanewayRules = lanewayRuleService.listByIds(laneList);
+            for (LanewayRule lanewayRule : lanewayRules) {
+                laneRowList.addAll(lanewayRule.getLaneX$());
+                laneRowList.addAll(lanewayRule.getLaneY$());
             }
         }
 
-        //3.浠庡叏灞�搴撲綅涓幏鍙�(瀹屾暣宸烽亾)
-        List<Loc> globalLoc = locUtils.getGlobalEmptyLoc(taskType, locTypeHeight);
-        //鑾峰彇搴撲綅
-        if (!globalLoc.isEmpty()) {
-            defaultLoc = locUtils.filterAllLoc(globalLoc);
-            if(defaultLoc != null) {
-                return defaultLoc;
+        Integer currentLev = null;
+        if (shelvesRule.getRuleType().equals(ShelvesRuleType.HIGH.id)) {
+            //浼樺厛绔嬩綋灞�
+            currentLev = circleRuleService.getCurrentValueByFlag(CircleRuleType.LEV.flag);
+        }
+
+        List<ShelvesRuleDetl> ruleDetls = shelvesRule.getRuleDetl$();
+        if(ruleDetls.isEmpty()) {
+            throw new CoolException("鏈厤缃笂鏋惰鍒欐槑缁�");
+        }
+
+        Loc defaultLoc = null;
+
+        for (ShelvesRuleDetl ruleDetl : ruleDetls) {
+            if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.TASK_OR_LOC.id)) {
+                //浠庡簱瀛樻垨浠诲姟涓尮閰嶇浉閭诲簱浣�
+                defaultLoc = locUtils.getNeighborEmptyLoc(taskType, locTypeHeight);
+                if (defaultLoc != null) {
+                    return defaultLoc;
+                }
+            }
+
+            if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.SUGGEST.id)) {
+                //鑾峰彇鎺ㄨ崘搴撲綅
+                List<Loc> suggestLoc = locUtils.getSuggestEmptyLoc(taskType, locTypeHeight, laneRowList, currentLev);
+                //鑾峰彇搴撲綅
+                if (!suggestLoc.isEmpty()) {
+                    defaultLoc = locUtils.filterLoc(taskType, suggestLoc);
+                    if(defaultLoc != null) {
+                        return defaultLoc;
+                    }
+                }
+            }
+
+            if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.COMPLETE.id)) {
+                //浠庡叏灞�搴撲綅涓幏鍙�(瀹屾暣宸烽亾)
+                List<Loc> globalLoc = locUtils.getGlobalEmptyLoc(taskType, locTypeHeight, laneRowList, currentLev);
+                //鑾峰彇搴撲綅
+                if (!globalLoc.isEmpty()) {
+                    defaultLoc = locUtils.filterAllLoc(globalLoc);
+                    if(defaultLoc != null) {
+                        return defaultLoc;
+                    }
+                }
             }
         }
 
@@ -109,34 +151,70 @@
             throw new CoolException("鍟嗗搧涓嶅瓨鍦�");
         }
 
+        List<ShelvesRule> shelvesRules = shelvesRuleService.list(new LambdaQueryWrapper<ShelvesRule>().eq(ShelvesRule::getStatus, 1).orderByDesc(ShelvesRule::getCreateTime));
+        if(shelvesRules.isEmpty()) {
+            throw new CoolException("鏈厤缃笂鏋惰鍒�");
+        }
+        ShelvesRule shelvesRule = shelvesRules.get(0);
+        //鍙敤宸烽亾
+        List<Long> laneList = shelvesRule.getLaneList();
+        //鍙敤宸烽亾Row
+        List<Integer> laneRowList = new ArrayList<>();
+        if (laneList != null) {
+            //鑾峰彇宸烽亾
+            List<LanewayRule> lanewayRules = lanewayRuleService.listByIds(laneList);
+            for (LanewayRule lanewayRule : lanewayRules) {
+                laneRowList.addAll(lanewayRule.getLaneX$());
+                laneRowList.addAll(lanewayRule.getLaneY$());
+            }
+        }
+
+        Integer currentLev = null;
+        if (shelvesRule.getRuleType().equals(ShelvesRuleType.HIGH.id)) {
+            //浼樺厛绔嬩綋灞�
+            currentLev = circleRuleService.getCurrentValueByFlag(CircleRuleType.LEV.flag);
+        }
+
+        List<ShelvesRuleDetl> ruleDetls = shelvesRule.getRuleDetl$();
+        if(ruleDetls.isEmpty()) {
+            throw new CoolException("鏈厤缃笂鏋惰鍒欐槑缁�");
+        }
+
         Loc defaultLoc = null;
 
-        //1.浠庡簱瀛樻垨浠诲姟涓尮閰嶇浉閭诲簱浣�
-        defaultLoc = locUtils.getNeighborLoc(taskType, detl, locTypeHeight);
-        if (defaultLoc != null) {
-            return defaultLoc;
-        }
+        for (ShelvesRuleDetl ruleDetl : ruleDetls) {
+            if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.TASK_OR_LOC.id)) {
+                //浠庡簱瀛樻垨浠诲姟涓尮閰嶇浉閭诲簱浣�
+                defaultLoc = locUtils.getNeighborLoc(taskType, detl, locTypeHeight);
+                if (defaultLoc != null) {
+                    return defaultLoc;
+                }
+            }
 
-        //2.鑾峰彇鎺ㄨ崘搴撲綅
-        List<Loc> suggestLoc = locUtils.getSuggestLoc(taskType, mat.getId(), detl.getBatch(), locTypeHeight);
-        //鑾峰彇搴撲綅
-        if (!suggestLoc.isEmpty()) {
-            defaultLoc = locUtils.filterLoc(taskType, suggestLoc);
-            if(defaultLoc != null) {
-                return defaultLoc;
+            if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.SUGGEST.id)) {
+                //鑾峰彇鎺ㄨ崘搴撲綅
+                List<Loc> suggestLoc = locUtils.getSuggestLoc(taskType, mat.getId(), detl.getBatch(), locTypeHeight, laneRowList, currentLev);
+                //鑾峰彇搴撲綅
+                if (!suggestLoc.isEmpty()) {
+                    defaultLoc = locUtils.filterLoc(taskType, suggestLoc);
+                    if(defaultLoc != null) {
+                        return defaultLoc;
+                    }
+                }
+            }
+
+            if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.COMPLETE.id)) {
+                //浠庡叏灞�搴撲綅涓幏鍙�(瀹屾暣宸烽亾)
+                List<Loc> globalLoc = locUtils.getGlobalLoc(taskType, locTypeHeight, laneRowList, currentLev);
+                //鑾峰彇搴撲綅
+                if (!globalLoc.isEmpty()) {
+                    defaultLoc = locUtils.filterAllLoc(globalLoc);
+                    if(defaultLoc != null) {
+                        return defaultLoc;
+                    }
+                }
             }
         }
-
-        //3.浠庡叏灞�搴撲綅涓幏鍙�(瀹屾暣宸烽亾)
-        List<Loc> globalLoc = locUtils.getGlobalLoc(taskType, locTypeHeight);
-        //鑾峰彇搴撲綅
-        if (!globalLoc.isEmpty()) {
-            defaultLoc = locUtils.filterAllLoc(globalLoc);
-            if(defaultLoc != null) {
-                return defaultLoc;
-            }
-        }
-
         return defaultLoc;
     }
 
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/result/LoginResult.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/result/LoginResult.java
index 86e014d..ef764f3 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/result/LoginResult.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/system/controller/result/LoginResult.java
@@ -1,24 +1,46 @@
 package com.zy.asrs.wms.system.controller.result;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.zy.asrs.wms.system.entity.User;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * Created by vincent on 1/30/2024
  */
 @Data
 @NoArgsConstructor
-@AllArgsConstructor
 public class LoginResult implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
     private String accessToken;
 
-    private User user;
+    private Map<String, Object> user;
 
+    public LoginResult(String accessToken, User user) {
+        this.accessToken = accessToken;
+
+        HashMap<String, Object> userMap = new HashMap<>();
+        userMap.put("username", user.getUsername());
+        userMap.put("nickname", user.getNickname());
+        userMap.put("avatar", user.getAvatar());
+        userMap.put("code", user.getCode());
+        userMap.put("sex", user.getSex());
+        userMap.put("phone", user.getPhone());
+        userMap.put("email", user.getEmail());
+        userMap.put("emailVerified", user.getEmailVerified());
+        userMap.put("deptId", user.getDeptId());
+        userMap.put("realName", user.getRealName());
+        userMap.put("hostId", user.getHostId());
+        userMap.put("status", user.getStatus());
+        userMap.put("memo", user.getMemo());
+        this.user = userMap;
+    }
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java
index 0964bf1..951922e 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java
@@ -22,8 +22,8 @@
 //        generator.username="sa";
 //        generator.password="Zoneyung@zy56$";
 
-        generator.table="strategy_shelves_rule";
-        generator.tableName="涓婃灦瑙勫垯";
+        generator.table="man_loc_map";
+        generator.tableName="搴撲綅鍦板浘";
         generator.rootPackagePath="com.zy.asrs.wms";
         generator.packagePath="com.zy.asrs.wms.asrs";
 
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/LocUtils.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/LocUtils.java
index 06d9e13..3c9330c 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/LocUtils.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/LocUtils.java
@@ -6,6 +6,7 @@
 import com.zy.asrs.wms.asrs.entity.*;
 import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
 import com.zy.asrs.wms.asrs.entity.enums.LocTypeHeightType;
+import com.zy.asrs.wms.asrs.entity.enums.ShelvesRuleType;
 import com.zy.asrs.wms.asrs.mapper.ViewLocDetlMapper;
 import com.zy.asrs.wms.asrs.mapper.ViewTaskDetlMapper;
 import com.zy.asrs.wms.asrs.service.*;
@@ -80,7 +81,7 @@
     }
 
     //鑾峰彇鎺ㄨ崘搴撲綅(婊℃墭鐩�)
-    public List<Loc> getSuggestLoc(Long taskType, Long matId, String batch, Integer locTypeHeight) {
+    public List<Loc> getSuggestLoc(Long taskType, Long matId, String batch, Integer locTypeHeight, List<Integer> laneRowList, Integer currentLev) {
         //婊℃墭鐩�
         List<Loc> locs = new ArrayList<>();
         LocTypeHeightType locTypeHeightType = LocTypeHeightType.get(locTypeHeight);
@@ -109,6 +110,15 @@
             queryWrapper.le(Loc::getLev1, suggestLocRule.getTargetLev());
             queryWrapper.eq(Loc::getLocStsId, LocStsType.O.val());
             queryWrapper.in(Loc::getId, locIdList);
+
+            if (laneRowList != null && !laneRowList.isEmpty()) {
+                queryWrapper.in(Loc::getRow1, laneRowList);
+            }
+
+            if (currentLev != null) {
+                queryWrapper.eq(Loc::getLev1, currentLev);
+            }
+
             List<Loc> list = locService.list(queryWrapper);
             if (!list.isEmpty()) {
                 locs.addAll(list);
@@ -118,7 +128,7 @@
     }
 
     //鑾峰彇鍏ㄥ眬搴撲綅(瀹屾暣宸烽亾)
-    public List<Loc> getGlobalLoc(Long taskType, Integer locTypeHeight) {
+    public List<Loc> getGlobalLoc(Long taskType, Integer locTypeHeight, List<Integer> laneRowList, Integer currentLev) {
         List<Loc> locs = new ArrayList<>();
         LocTypeHeightType locTypeHeightType = LocTypeHeightType.get(locTypeHeight);
         if (locTypeHeightType == null) {
@@ -132,6 +142,15 @@
         LambdaQueryWrapper<Loc> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(Loc::getLocStsId, LocStsType.O.val());
         queryWrapper.in(Loc::getId, locIdList);
+
+        if (laneRowList != null && !laneRowList.isEmpty()) {
+            queryWrapper.in(Loc::getRow1, laneRowList);
+        }
+
+        if (currentLev != null) {
+            queryWrapper.eq(Loc::getLev1, currentLev);
+        }
+
         List<Loc> list = locService.list(queryWrapper);
         if (!list.isEmpty()) {
             locs.addAll(list);
@@ -270,7 +289,7 @@
     }
 
     //鑾峰彇鎺ㄨ崘搴撲綅(绌烘墭鐩�)
-    public List<Loc> getSuggestEmptyLoc(Long taskType, Integer locTypeHeight) {
+    public List<Loc> getSuggestEmptyLoc(Long taskType, Integer locTypeHeight, List<Integer> laneRowList, Integer currentLev) {
         List<Loc> locs = new ArrayList<>();
         //绌烘墭鐩�
         List<SuggestLocRule> suggestLocRules = suggestLocRuleService.list(new LambdaQueryWrapper<SuggestLocRule>().eq(SuggestLocRule::getLocType, 0));
@@ -283,6 +302,15 @@
             queryWrapper.ge(Loc::getLev1, suggestLocRule.getStartLev());
             queryWrapper.le(Loc::getLev1, suggestLocRule.getTargetLev());
             queryWrapper.eq(Loc::getLocStsId, LocStsType.O.val());
+
+            if (laneRowList != null && !laneRowList.isEmpty()) {
+                queryWrapper.in(Loc::getRow1, laneRowList);
+            }
+
+            if (currentLev != null) {
+                queryWrapper.eq(Loc::getLev1, currentLev);
+            }
+
             List<Loc> list = locService.list(queryWrapper);
             if (!list.isEmpty()) {
                 locs.addAll(list);
@@ -292,7 +320,7 @@
     }
 
     //鑾峰彇鍏ㄥ眬搴撲綅(瀹屾暣宸烽亾)
-    public List<Loc> getGlobalEmptyLoc(Long taskType, Integer locTypeHeight) {
+    public List<Loc> getGlobalEmptyLoc(Long taskType, Integer locTypeHeight, List<Integer> laneRowList, Integer currentLev) {
         List<Loc> locs = new ArrayList<>();
         LocTypeHeightType locTypeHeightType = LocTypeHeightType.get(locTypeHeight);
         if (locTypeHeightType == null) {
@@ -306,6 +334,15 @@
         LambdaQueryWrapper<Loc> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(Loc::getLocStsId, LocStsType.O.val());
         queryWrapper.in(Loc::getId, locIdList);
+
+        if (laneRowList != null && !laneRowList.isEmpty()) {
+            queryWrapper.in(Loc::getRow1, laneRowList);
+        }
+
+        if (currentLev != null) {
+            queryWrapper.eq(Loc::getLev1, currentLev);
+        }
+
         List<Loc> list = locService.list(queryWrapper);
         if (!list.isEmpty()) {
             locs.addAll(list);
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/Utils.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/Utils.java
index d203a74..edeab46 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/Utils.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/Utils.java
@@ -17,6 +17,45 @@
  */
 public class Utils {
 
+    public static final String _LINK = "-";
+
+    /**
+     * 閫氳繃搴撲綅鍙疯幏鍙� 鎺�
+     */
+    public static int getRow(String locNo) {
+        if (!Cools.isEmpty(locNo)) {
+            String[] split = locNo.split(_LINK);
+            return Integer.parseInt(split[0]);
+        }
+        throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
+    }
+
+    /**
+     * 閫氳繃搴撲綅鍙疯幏鍙� 鍒�
+     */
+    public static int getBay(String locNo) {
+        if (!Cools.isEmpty(locNo)) {
+            String[] split = locNo.split(_LINK);
+            return Integer.parseInt(split[1]);
+        }
+        throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
+    }
+
+    /**
+     * 閫氳繃搴撲綅鍙疯幏鍙� 灞�
+     */
+    public static int getLev(String locNo) {
+        if (!Cools.isEmpty(locNo)) {
+            String[] split = locNo.split(_LINK);
+            return Integer.parseInt(split[2]);
+        }
+        throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
+    }
+
+    public static String getLocNo(Number row, Number bay, Number lev) {
+        return row + _LINK + bay + _LINK + lev;
+    }
+
     /**
      * List杞负鏍戝舰缁撴瀯
      *
diff --git a/zy-asrs-wms/src/main/resources/license.lic b/zy-asrs-wms/src/main/resources/license.lic
index b80345a..cb51cd3 100644
--- a/zy-asrs-wms/src/main/resources/license.lic
+++ b/zy-asrs-wms/src/main/resources/license.lic
Binary files differ
diff --git a/zy-asrs-wms/src/main/resources/mapper/asrs/LocMapMapper.xml b/zy-asrs-wms/src/main/resources/mapper/asrs/LocMapMapper.xml
new file mode 100644
index 0000000..1a0db57
--- /dev/null
+++ b/zy-asrs-wms/src/main/resources/mapper/asrs/LocMapMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.wms.asrs.mapper.LocMapMapper">
+
+</mapper>
diff --git a/zy-asrs-wms/src/main/resources/sql/menu/locMap.sql b/zy-asrs-wms/src/main/resources/sql/menu/locMap.sql
new file mode 100644
index 0000000..2c1d2b1
--- /dev/null
+++ b/zy-asrs-wms/src/main/resources/sql/menu/locMap.sql
@@ -0,0 +1,9 @@
+-- save locMap record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `host_id`, `status`) values ( '搴撲綅鍦板浘绠$悊', '0', '/asrs/locMap', '/asrs/locMap', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鏌ヨ搴撲綅鍦板浘', '', '1', 'asrs:locMap:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '娣诲姞搴撲綅鍦板浘', '', '1', 'asrs:locMap:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '淇敼搴撲綅鍦板浘', '', '1', 'asrs:locMap:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `host_id`, `status`) values ( '鍒犻櫎搴撲綅鍦板浘', '', '1', 'asrs:locMap:remove', '3', '1', '1');
+

--
Gitblit v1.9.1