#
Junjie
2024-08-19 18147c6baeb59f3427eba5904614e924a6a72785
#
13个文件已添加
16个文件已修改
3176 ■■■■■ 已修改文件
license.lic 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/package-lock.json 1217 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/package.json 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/components/loc/map/index.vue 755 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/components/locDetl/show.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/base/locTypeBind/edit.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/base/locTypeBind/index.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/base/locTypeBind/init.vue 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/loc/loc/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/loc/locMap/edit.vue 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/loc/locMap/index.vue 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/loc/locMap/locMap.vue 250 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/system/language/edit.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocMapController.java 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocTypeBindController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/Loc.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocMap.java 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/InitLocTypeBindParam.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocMapMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocMapService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CircleRuleServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocMapServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/CodeBuilder.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/Utils.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/resources/license.lic 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/resources/mapper/asrs/LocMapMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/resources/sql/menu/locMap.sql 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
license.lic
Binary files differ
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",
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"
  }
}
}
zy-asrs-admin/src/components/loc/map/index.vue
New file
@@ -0,0 +1,755 @@
<script setup>
import { ref, onMounted, watch } 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 LocDetlShowView from '@/components/locDetl/show.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;
            // 记录下stage原来的位置
            stageOriginalPos = [pixiApp.stage.position._x, pixiApp.stage.position._y];
            // 记录下mouse 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();
        // 因为画布是充满视窗的,所以clientX等于mouse point在renderer上的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 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>
        <!--输出操作和FPS-->
        <div style="position: absolute;top: 0px;right: 10px;user-select: none;">
            <div>FPS:{{ mapFps }}</div>
            <a-button @click="drawerOper = true">操作</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>
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) => {
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" />
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>
zy-asrs-admin/src/views/base/locTypeBind/init.vue
New file
@@ -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>
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;
}
zy-asrs-admin/src/views/loc/locMap/edit.vue
New file
@@ -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: '正常', 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>
zy-asrs-admin/src/views/loc/locMap/index.vue
New file
@@ -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>
zy-asrs-admin/src/views/loc/locMap/locMap.vue
New file
@@ -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>
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>
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java
@@ -8,6 +8,7 @@
import com.zy.asrs.framework.common.R;
import com.zy.asrs.wms.asrs.entity.*;
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;
@@ -27,6 +28,8 @@
@RequestMapping("/api")
public class LocDetlController extends BaseController {
    @Autowired
    private LocService locService;
    @Autowired
    private LocDetlService locDetlService;
    @Autowired
@@ -72,6 +75,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));
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocMapController.java
New file
@@ -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));
        //解析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));
        //解析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("添加成功");
    }
}
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) {
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);
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;
    }
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocMap.java
New file
@@ -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: 正常  0: 禁用
     */
    @ApiModelProperty(value= "状态 1: 正常  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 "正常";
            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);
    }
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/InitLocTypeBindParam.java
New file
@@ -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;
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/LocMapMapper.java
New file
@@ -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> {
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocMapService.java
New file
@@ -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> {
}
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;
    }
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocMapServiceImpl.java
New file
@@ -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 {
}
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_detl";
        generator.tableName="上架规则明细";
        generator.table="man_loc_map";
        generator.tableName="库位地图";
        generator.rootPackagePath="com.zy.asrs.wms";
        generator.packagePath="com.zy.asrs.wms.asrs";
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("库位解析异常");
    }
    /**
     * 通过库位号获取 列
     */
    public static int getBay(String locNo) {
        if (!Cools.isEmpty(locNo)) {
            String[] split = locNo.split(_LINK);
            return Integer.parseInt(split[1]);
        }
        throw new RuntimeException("库位解析异常");
    }
    /**
     * 通过库位号获取 层
     */
    public static int getLev(String locNo) {
        if (!Cools.isEmpty(locNo)) {
            String[] split = locNo.split(_LINK);
            return Integer.parseInt(split[2]);
        }
        throw new RuntimeException("库位解析异常");
    }
    public static String getLocNo(Number row, Number bay, Number lev) {
        return row + _LINK + bay + _LINK + lev;
    }
    /**
     * List转为树形结构
     *
zy-asrs-wms/src/main/resources/license.lic
Binary files differ
zy-asrs-wms/src/main/resources/mapper/asrs/LocMapMapper.xml
New file
@@ -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>
zy-asrs-wms/src/main/resources/sql/menu/locMap.sql
New file
@@ -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');