huangxiaoqiang
2025-11-15 0204bc614e3132ce94d3fb1de9d330e9250f233c
新增大屏显示,优化WMS首页数据展示,后端数据推送接口新加库存差异比较
已添加31个文件
已修改12个文件
20085 ■■■■■ 文件已修改
项目代码/BigScreenVue/.gitignore 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/LICENSE 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/README.md 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/babel.config.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/package-lock.json 15277 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/package.json 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/public/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/public/image.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/public/index.html 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/App.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/api/ajax.js 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/api/http.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/assets/bg5.jpg 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/assets/cnmc_logo.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/assets/head_bg1.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/assets/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/assets/pageBg.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/assets/scss/_variables.scss 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/assets/scss/index.scss 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/assets/scss/style.scss 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/common/echart/index.vue 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/common/echart/theme.json 490 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/common/map/fujian.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/main.js 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/router/index.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/store/index.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/utils/drawMixin.js 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/utils/index.js 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/utils/resizeMixin.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/src/views/index.vue 1331 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/BigScreenVue/vue.config.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.backup.json 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSClient/src/views/Home.vue 1339 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db-shm 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db-wal 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db-shm 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db-wal 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/DocumentLayout.backup.json 106 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/DocumentLayout.json 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicServices/Stock/StockInfoService.cs 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/BigScreenVue/.gitignore
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
ÏîÄ¿´úÂë/BigScreenVue/LICENSE
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,201 @@
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/
   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
   1. Definitions.
      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.
      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.
      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.
      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.
      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.
      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.
      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).
      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.
      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."
      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.
   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.
   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.
   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:
      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and
      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and
      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and
      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.
      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.
   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.
   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.
   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.
   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.
   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.
   END OF TERMS AND CONDITIONS
   APPENDIX: How to apply the Apache License to your work.
      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.
   Copyright [yyyy] [name of copyright owner]
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at
       http://www.apache.org/licenses/LICENSE-2.0
   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
ÏîÄ¿´úÂë/BigScreenVue/README.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,200 @@
 **QQ交流群: 713105837 å¼€æºé¡¹ç›®Vue/Vue3/React-big-screen交流群**
QQ群二维码:
![输入图片说明](public/image.png)
## ä¸€ã€é¡¹ç›®æè¿°
- ä¸€ä¸ªåŸºäºŽ Vue、Datav、Echart æ¡†æž¶çš„ " **数据大屏项目** ",通过 Vue ç»„件实现数据动态刷新渲染,内部图表可实现自由替换。部分图表使用 DataV è‡ªå¸¦ç»„件,可进行更改,详情请点击下方 DataV æ–‡æ¡£ã€‚
- [**Vue3 ç‰ˆæœ¬è¯·ç‚¹å‡»è¿™é‡ŒæŸ¥çœ‹ï¼Œä½¿ç”¨ Hooks+TypeScript å®žçŽ°ï¼Œå…¨æ–°å†…å®¹ç­‰ä½ æŽ¢ç´¢!**](https://gitee.com/MTrun/vue-big-screen-plugin)
- [**React ç‰ˆæœ¬è¯·ç‚¹å‡»è¿™é‡ŒæŸ¥çœ‹ï¼Œå…¨æ–°ç•Œé¢è¶…级好看!!!**](https://gitee.com/MTrun/react-big-screen)
- é¡¹ç›®éœ€è¦å…¨å±å±•示(按 F11)。
- é¡¹ç›®éƒ¨åˆ†åŒºåŸŸä½¿ç”¨äº†å…¨å±€æ³¨å†Œæ–¹å¼ï¼Œå¢žåŠ äº†æ‰“åŒ…ä½“ç§¯ï¼Œåœ¨å®žé™…è¿ç”¨ä¸­è¯·ä½¿ç”¨ **按需引入**。
- æ‹‰å–项目之后,建议按照自己的功能区域重命名文件,现以简单的位置进行区分。
- é¡¹ç›®çŽ¯å¢ƒï¼šVue-cli-3.0、DataV-2.7.3、Echarts-4.6.0(如果5.x版本有问题,请切换到4.x版本)、Webpack-4.0、Npm-6.13、Node-v12.16。
- è¯·æ‹‰å– master åˆ†æ”¯çš„代码,其余分支是开发分支。
- éœ€è¦å…¶å®ƒåœ°å›¾æ•°æ®çš„,请查看我的其它项目(有一个地图合集)
友情链接:
1.  [Vue å®˜æ–¹æ–‡æ¡£](https://cn.vuejs.org/v2/guide/instance.html)
2.  [DataV å®˜æ–¹æ–‡æ¡£](http://datav.jiaminghi.com/guide/)
3.  [echarts å®žä¾‹](https://echarts.apache.org/examples/zh/index.html),[echarts API æ–‡æ¡£](https://echarts.apache.org/zh/api.html#echarts)
4.  [项目 gitee åœ°å€ï¼ˆå›½å†…速度快)](https://gitee.com/MTrun/big-screen-vue-datav)
项目展示
![项目展示](https://images.gitee.com/uploads/images/2020/1208/183608_b893a510_4964818.gif "20201208_221020.gif")
## äºŒã€ä¸»è¦æ–‡ä»¶ä»‹ç»
| æ–‡ä»¶                | ä½œç”¨/功能                                                              |
| ------------------- | --------------------------------------------------------------------- |
| main.js             | ä¸»ç›®å½•文件,引入 Echart/DataV ç­‰æ–‡ä»¶                                    |
| utils               | å·¥å…·å‡½æ•°ä¸Ž mixins å‡½æ•°ç­‰                                                |
| views/ index.vue    | é¡¹ç›®ä¸»ç»“æž„                                                             |
| views/其余文件       | ç•Œé¢å„个区域组件(按照位置来命名)                                       |
| assets              | é™æ€èµ„源目录,放置 logo ä¸ŽèƒŒæ™¯å›¾ç‰‡                                       |
| assets / style.scss | é€šç”¨ CSS æ–‡ä»¶ï¼Œå…¨å±€é¡¹ç›®å¿«æ·æ ·å¼è°ƒèŠ‚                                      |
| assets / index.scss | Index ç•Œé¢çš„ CSS æ–‡ä»¶                                                  |
| components/echart   | æ‰€æœ‰ echart å›¾è¡¨ï¼ˆæŒ‰ç…§ä½ç½®æ¥å‘½åï¼‰                                      |
| common/...          | å…¨å±€å°è£…çš„ ECharts å’Œ flexible æ’件代码(适配屏幕尺寸,可定制化修改)     |
## ä¸‰ã€ä½¿ç”¨ä»‹ç»
### å¯åŠ¨é¡¹ç›®
需要提前安装好 `nodejs` ä¸Ž `yarn`,下载项目后在项目主目录下运行 `yarn` æ‹‰å–依赖包。安装完依赖包之后然后使用 `vue-cli` æˆ–者直接使用命令`npm run serve`,就可以启动项目,启动项目后需要手动全屏(按 F11)。如果编译项目的时候提示没有 DataV æ¡†æž¶çš„依赖,输入 `npm install @jiaminghi/data-view` æˆ–者 `yarn add @jiaminghi/data-view` è¿›è¡Œæ‰‹åŠ¨å®‰è£…ã€‚
### å°è£…组件渲染图表
所有的 ECharts å›¾è¡¨éƒ½æ˜¯åŸºäºŽ `common/echart/index.vue` å°è£…组件创建的,已经对数据和屏幕改动进行了监听,能够动态渲染图表数据和大小。在监听窗口小大的模块,使用了防抖函数来控制更新频率,节约浏览器性能。
项目配置了默认的 ECharts å›¾è¡¨æ ·å¼ï¼Œæ–‡ä»¶åœ°å€ï¼š`common/echart/theme.json`。
封装的渲染图表组件支持传入以下参数,可根据业务需求自行添加/删除。
参数名称              | ç±»åž‹      | ä½œç”¨/功能                      |
| -------------------| --------- | ------------------------------|
| id                 | String    | å”¯ä¸€ id,渲染图表的节点(非必填,使用了 $el)|
| className          | String    | class样式名称(非必填)                 |
| options            | Object    | ECharts é…ç½®ï¼ˆå¿…填)                   |
| height             | String    | å›¾è¡¨é«˜åº¦ï¼ˆå»ºè®®å¡«ï¼‰                    |
| width              | String    | å›¾è¡¨å®½åº¦ï¼ˆå»ºè®®å¡«ï¼‰                    |
### åŠ¨æ€æ¸²æŸ“å›¾è¡¨
动态渲染图表案例为 `components` ç›®å½•下各个图表组件,index æ–‡ä»¶è´Ÿè´£æ•°æ®èŽ·å–å’Œå¤„ç†ï¼Œchart æ–‡ä»¶è´Ÿè´£ç›‘听和数据渲染。
chart æ–‡ä»¶çš„主要逻辑为:
```html
<template>
  <div>
    <Echart :options="options" id="id" height="height" width="width" ></Echart>
  </div>
</template>
<script>
  // å¼•入封装组件
import Echart from '@/common/echart'
export default {
  // å®šä¹‰é…ç½®æ•°æ®
  data(){ return { options: {}}},
  // å£°æ˜Žç»„ä»¶
  components: { Echart},
  // æŽ¥æ”¶æ•°æ®
  props: {
    cdata: {
      type: Object,
      default: () => ({})
    },
  },
  // è¿›è¡Œç›‘听,也可以使用 computed è®¡ç®—属性实现此功能
  watch: {
    cdata: {
      handler (newData) {
        this.options ={
          // è¿™é‡Œç¼–写 ECharts é…ç½®
        }
      },
      // ç«‹å³ç›‘听
      immediate: true,
      // æ·±åº¦ç›‘听
      deep: true
    }
  }
};
</script>
```
### å¤ç”¨å›¾è¡¨ç»„ä»¶
复用图表组件案例为中间部分的 `任务通过率与任务达标率` æ¨¡å—,两个图表类似,区别在于颜色和主要渲染数据。只需要传入对应的唯一 id å’Œæ ·å¼ï¼Œç„¶åŽåœ¨å¤ç”¨çš„组件 `components/echart/center/centerChartRate` é‡Œè¿›è¡ŒæŽ¥æ”¶å¹¶åœ¨å¯¹åº”位置赋值即可。
如:在调用处 `views/center.vue` é‡ŒåŽ»å®šä¹‰å¥½æ•°æ®å¹¶ä¼ å…¥ç»„ä»¶
```js
//组件调用
<span>今日任务通过率</span>
<centerChart :id="rate[0].id" :tips="rate[0].tips" :colorObj="rate[0].colorData" />
<span>今日任务达标率</span>
<centerChart :id="rate[1].id" :tips="rate[1].tips" :colorObj="rate[1].colorData" />
...
import centerChart from "@/components/echart/center/centerChartRate";
data() {
  return {
    rate: [
      {
        id: "centerRate1",
        tips: 60,
        ...
      },
      {
        id: "centerRate2",
        tips: 40,
        colorData: {
          ...
        }
      }
    ]
  }
}
```
### æ›´æ¢è¾¹æ¡†
边框是使用了 DataV è‡ªå¸¦çš„组件,只需要去 views ç›®å½•下去寻找对应的位置去查找并替换就可以,具体的种类请去 DavaV å®˜ç½‘查看
如:
```html
<dv-border-box-1></dv-border-box-1>
<dv-border-box-2></dv-border-box-2>
<dv-border-box-3></dv-border-box-3>
```
### æ›´æ¢å›¾è¡¨
直接进入 `components/echart` ä¸‹çš„æ–‡ä»¶ä¿®æ”¹æˆä½ è¦çš„ echarts æ¨¡æ ·ï¼Œå¯ä»¥åŽ»[echarts å®˜æ–¹ç¤¾åŒº](https://gallery.echartsjs.com/explore.html#sort=rank~timeframe=all~author=all)里面查看案例。
### Mixins è§£å†³è‡ªé€‚应适配功能
使用 mixins æ³¨å…¥è§£å†³äº†ç•Œé¢å¤§å°å˜åŠ¨å›¾è¡¨è‡ªé€‚åº”é€‚é…çš„åŠŸèƒ½ï¼Œå‡½æ•°åœ¨ `utils/resizeMixins.js` ä¸­ï¼Œåº”用在 `common/echart/index.vue` çš„封装渲染组件,主要是对 `this.chart` è¿›è¡Œäº†åŠŸèƒ½æ³¨å…¥ã€‚
### å±å¹•适配
1.5 ç‰ˆæœ¬é¡¹ç›®æ”¾å¼ƒäº† flexible æ’件方案,将 rem æ”¹å›žpx,使用更流程通用的 `css3:scale` ç¼©æ”¾æ–¹æ¡ˆï¼Œé€šè¿‡ `ref` æŒ‡å‘ `views/index`,屏幕改变时缩放内容。项目的基准尺寸是 `1920px*1080px`,所以支持同比例屏幕 100% å¡«å……,如果非同比例则会自动计算比例居中填充,不足的部分则留白。实现代码在 `src/utils/userDraw` ï¼Œå¦‚果有其它的适配方案,欢迎交流。
### è¯·æ±‚数据
现在的项目未使用前后端数据请求,建议使用 axios è¿›è¡Œæ•°æ®è¯·æ±‚,在 main.js ä½ç½®è¿›è¡Œå…¨å±€é…ç½®ã€‚
- axios çš„ main.js é…ç½®å‚考范例(因人而异)
```js
import axios from 'axios';
//把方法放到vue的原型上,这样就可以全局使用了
Vue.prototype.$http = axios.create({
  //设置20秒超时时间
  timeout: 20000,
  baseURL: 'http://172.0.0.1:80080', //这里写后端地址
});
```
## å››ã€æ›´æ–°æƒ…况
1. å¢žåŠ äº† Echart ç»„件复用的功能,如:中间任务达标率的两个百分比图使用的是同一个组件。
2. ä¿®å¤äº†å¤´éƒ¨å³ä¾§çš„图案条不对称的问题。
3. ä½¿ç”¨ Mixins æ³¨å…¥å›¾è¡¨å“åº”式代码(scale方案之后无需使用)。
4. vue-awesome æ”¹æˆæŒ‰éœ€å¼•入的方式。
5. å°è£…渲染函数,抽离了数据使逻辑更加清晰。
6. æ–°å¢žåœ°å›¾ç»„件,并添加自动轮播功能
7. å°†é€‚配方案从 rem æ”¹æˆ scale
## äº”、其余
这个项目是个人的作品,难免会有问题和 BUG,如果有问题请进行评论,我也会尽力去更新,自己也在前端学习的路上,欢迎交流,非常感谢!
ÏîÄ¿´úÂë/BigScreenVue/babel.config.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ]
}
ÏîÄ¿´úÂë/BigScreenVue/package-lock.json
¶Ô±ÈÐÂÎļþ
ÎļþÌ«´ó
ÏîÄ¿´úÂë/BigScreenVue/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
{
  "name": "big-screen-vue-datav",
  "version": "1.5.1",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "@jiaminghi/data-view": "^2.7.3",
    "@types/echarts": "^4.4.3",
    "@vue/cli-plugin-babel": "^5.0.4",
    "@vue/cli-plugin-eslint": "^5.0.4",
    "@vue/composition-api": "^1.4.9",
    "@vue/shared": "^3.2.33",
    "axios": "^0.26.1",
    "babel-loader": "^8.2.5",
    "cache-loader": "^4.1.0",
    "core-js": "^3.6.4",
    "echarts": "^4.6.0",
    "element-plus": "^2.1.10",
    "element-ui": "^2.15.8",
    "vue": "^2.6.11",
    "vue-awesome": "^4.0.2",
    "vue-axios": "^3.4.1",
    "vue-loader": "^17.0.0",
    "vue-resource": "^1.5.3",
    "vue-router": "^3.1.5",
    "vuex": "^3.1.2",
    "yarn": "^1.22.18"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^4.2.0",
    "@vue/cli-plugin-eslint": "^4.2.0",
    "@vue/cli-service": "^4.2.0",
    "babel-eslint": "^10.0.3",
    "eslint": "^6.7.2",
    "eslint-plugin-vue": "^6.1.2",
    "sass": "^1.25.0",
    "sass-loader": "^8.0.2",
    "vue-template-compiler": "^2.6.11"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],
    "parserOptions": {
      "parser": "babel-eslint"
    },
    "rules": {
      "vue/no-unused-components": "off",
      "no-unused-vars": "off"
    }
  },
  "browserslist": [
    "> 1%",
    "last 2 versions"
  ]
}
ÏîÄ¿´úÂë/BigScreenVue/public/favicon.ico
ÏîÄ¿´úÂë/BigScreenVue/public/image.png
ÏîÄ¿´úÂë/BigScreenVue/public/index.html
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- <meta name="viewport" content="width=device-width,initial-scale=1.0"> -->
    <meta name="viewport" content="width=device-width,user-scalable=yes, initial-scale=0.4, maxmum-scale=1.0, minimum-scale=0.4">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>
ÏîÄ¿´úÂë/BigScreenVue/src/App.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
<template>
  <div id="app">
    <router-view />
  </div>
</template>
<style lang="scss" scoped>
#app {
  width: 100vw;
  height: 100vh;
  background-color: #020308;
  overflow: hidden;
}
</style>
ÏîÄ¿´úÂë/BigScreenVue/src/api/ajax.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
// è¿™ä¸ªæ—¶axios的配置
import axios from 'axios';
// import { config } from 'vue/types/umd';
axios.defaults.baseURL =  'http://localhost:5000';//'http://192.168.2.110:8098';//
// é”™è¯¯ä¿¡æ¯å¤„理
const  errorHandle = (status, other) => {
  switch (status) {
    case 400:
      console.log('信息验证失败');
      break;
    case 401:
      console.log('认证失败');
      break;
    case 403:
      localStorage.removeItem("token");
      console.log('token校验失败');
      break;
    case 404:
      console.log('请求资源不存在');
      break;
    default :
      console.log(other);
      break;
  }
}
// æ·»åŠ è¯·æ±‚æ‹¦æˆªå™¨
axios.interceptors.request.use(function (config) {
  // åœ¨å‘送请求之前做些什么
  // console.log(config);
  if(localStorage.elementToken){
    config.headers.Authorization=localStorage.elementToken;
  }
  // console.log(config);
  return config;
}, function (error) {
  // å¯¹è¯·æ±‚错误做些什么
  return Promise.reject(error);
});
// æ·»åŠ å“åº”æ‹¦æˆªå™¨
axios.interceptors.response.use(function (response) {
  // å¯¹å“åº”数据做点什么
  // console.log();
  // console.log(response.data.token);
  // response.headers['Authorization'] = response.data.token;
  return response.status=== 200 ? Promise.resolve(response): Promise.reject(response);
}, function (error) {
  // å¯¹å“åº”错误做点什么
  const {response}=error;
  if(response){
    errorHandle(response.status,response.data.message)
    return Promise.reject(response.data);
  }else{
    console.log('断了');
  }
});
export default axios;
ÏîÄ¿´úÂë/BigScreenVue/src/api/http.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
import axios from './ajax';
ÏîÄ¿´úÂë/BigScreenVue/src/assets/bg5.jpg
ÏîÄ¿´úÂë/BigScreenVue/src/assets/cnmc_logo.png
ÏîÄ¿´úÂë/BigScreenVue/src/assets/head_bg1.png
ÏîÄ¿´úÂë/BigScreenVue/src/assets/logo.png
ÏîÄ¿´úÂë/BigScreenVue/src/assets/pageBg.png
ÏîÄ¿´úÂë/BigScreenVue/src/assets/scss/_variables.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
// é¢œè‰²
$colors: (
  "primary": #1A5CD7,
  "info-1": #4394e4,
  "info": #4b67af,
  "white": #ffffff,
  "light": #f9f9f9,
  "grey-1": #999999,
  "grey": #666666,
  "dark-1": #5f5f5f,
  "dark": #222222,
  "black-1": #171823,
  "black": #000000,
  "icon": #5cd9e8
);
// å­—体大小
$base-font-size: 0.2rem;
$font-sizes: (
  xxs: 0.1,
  //8px
    xs: 0.125,
  //10px
    sm: 0.2875,
  //12px
    md: 0.1625,
  //13px
    lg: 0.175,
  //14px
    xl: 0.2,
  //16px
    xxl: 0.225,
  //18px
    xxxl: 0.25 //20px,,,,
);
// å®½é«˜
.w-100 {
  width: 100%;
}
.h-100 {
  height: 100%;
}
//flex
.d-flex {
  display: flex;
}
.flex-column {
  flex-direction: column;
}
.flex-wrap {
  flex-wrap: wrap;
}
.flex-nowrap {
  flex-wrap: nowrap;
}
$flex-jc: (
  start: flex-start,
  end: flex-end,
  center: center,
  between: space-between,
  around: space-around,
  evenly: space-evenly,
);
$flex-ai: (
  start: flex-start,
  end: flex-end,
  center: center,
  stretch: stretch,
);
.flex-1 {
  flex: 1;
}
//.mt-1 => margin top
//spacing
$spacing-types: (
  m: margin,
  p: padding,
);
$spacing-directions: (
  t: top,
  r: right,
  b: bottom,
  l: left,
);
$spacing-base-size: 0.5rem;
$spacing-sizes: (
  0: 0,
  1: 0.5,
  2: 1,
  3: 1.5,
  4: 2,
  5: 2.5,
);
ÏîÄ¿´úÂë/BigScreenVue/src/assets/scss/index.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,146 @@
#index {
  color: #d3d6dd;
  width: 1920px;
  height: 1080px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  transform-origin: left top;
  overflow: hidden;
  .bg {
    width: 100%;
    height: 100%;
    padding: 25px 16px 0 16px;
    background-image: url("../assets/bg5.jpg");
    // url("../assets/bg5.jpg");
    background-size: cover;
    background-position: center center;
  }
  .host-body {
    .dv-dec-10,
    .dv-dec-10-s {
      width: 133.3%;
      height: 5px;
    }
    .dv-dec-10-s {
      transform: rotateY(180deg);
    }
    .dv-dec-8 {
      width: 200px;
      height: 50px;
    }
    .title {
      position: relative;
      width: 500px;
      text-align: center;
      background-size: cover;
      background-repeat: no-repeat;
      .title-text {
        font-size: 25px;
        position: absolute;
        padding-top: 10px;
        left: 30%;
        transform: translate(-50%);
      }
      .dv-dec-6 {
        position: absolute;
        bottom: -30px;
        left: 30%;
        width: 250px;
        height: 8px;
        transform: translate(-50%);
      }
    }
    // ç¬¬äºŒè¡Œ
    .aside-width {
      width: 40%;
    }
    .react-r-s,
    .react-l-s {
      background-color: #0f1325;
    }
    // å¹³è¡Œå››è¾¹å½¢
    .react-right {
      &.react-l-s {
        text-align: right;
        width: 500px;
      }
      font-size: 18px;
      width: 300px;
      line-height: 30px;
      text-align: center;
      transform: skewX(-45deg);
      .react-after {
        position: absolute;
        right: -25px;
        top: 0;
        height: 50px;
        width: 50px;
        background-color: #0f1325;
        transform: skewX(45deg);
      }
      .text {
        padding-left: 80px;
        display: inline-block;
        transform: skewX(45deg);
      }
    }
    .react-left {
      &.react-l-s {
        width: 500px;
        text-align: left;
      }
      font-size: 18px;
      width: 300px;
      height: 50px;
      line-height: 50px;
      text-align: center;
      transform: skewX(45deg);
      background-color: #0f1325;
      .react-before {
        position: absolute;
        left: -25px;
        top: 0;
        height: 50px;
        width: 50px;
        background-color: #0f1325;
        transform: skewX(-45deg);
      }
      .text {
        display: inline-block;
        transform: skewX(-45deg);
      }
    }
    .body-box {
      margin-top: 1px;
      display: flex;
      flex-direction: column;
      //下方区域的布局
      .content-box {
        display: grid;
        grid-template-columns:35% 65%;
      }
      // åº•部数据
      .bototm-box {
        margin-top: 1px;
        display: grid;
        grid-template-columns: 35% 35% 30%;
      }
    }
  }
}
ÏîÄ¿´úÂë/BigScreenVue/src/assets/scss/style.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,185 @@
@import "./variables";
//  å…¨å±€æ ·å¼
* {
  margin: 0;
  padding: 0;
  list-style-type: none;
  outline: none;
  box-sizing: border-box;
}
html {
  margin: 0;
  padding: 0;
}
body {
  font-family: Arial, Helvetica, sans-serif;
  line-height: 1.2em;
  background-color: #f1f1f1;
  margin: 0;
  padding: 0;
}
a {
  color: #343440;
  text-decoration: none;
}
.clearfix {
  &::after {
    content: "";
    display: table;
    height: 0;
    line-height: 0;
    visibility: hidden;
    clear: both;
  }
}
//浮动
.float-r {
  float: right;
}
//浮动
.float-l {
  float: left;
}
// å­—体加粗
.fw-b {
  font-weight: bold;
}
//文章一行显示,多余省略号显示
.title-item {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.bg-color-black {
  background-color: rgba(19, 25, 47, 0.6);
}
.bg-color-blue {
  background-color: #1a5cd7;
}
.colorBlack {
  color: #272727 !important;
  &:hover {
    color: #272727 !important;
  }
}
.colorGrass {
  color: #33cea0;
  &:hover {
    color: #33cea0 !important;
  }
}
.colorRed {
  color: #ff5722;
  &:hover {
    color: #ff5722 !important;
  }
}
.colorText {
  color: #d3d6dd !important;
  &:hover {
    color: #d3d6dd !important;
  }
}
.colorBlue {
  color: #257dff !important;
  &:hover {
    color: #257dff !important;
  }
}
//颜色
@each $colorkey, $color in $colors {
  .text-#{$colorkey} {
    color: $color;
  }
  .bg-#{$colorkey} {
    background-color: $color;
  }
}
//对齐
@each $var in (left, center, right) {
  .text-#{$var} {
    text-align: $var !important;
  }
}
//flex
@each $key, $value in $flex-jc {
  .jc-#{$key} {
    justify-content: $value;
  }
}
@each $key, $value in $flex-ai {
  .ai-#{$key} {
    align-items: $value;
  }
}
//字体
@each $fontkey, $fontvalue in $font-sizes {
  .fs-#{$fontkey} {
    font-size: $fontvalue * $base-font-size;
  }
}
//.mt-1 => margin top
//spacing
@each $typekey, $type in $spacing-types {
  //.m-1
  @each $sizekey, $size in $spacing-sizes {
    .#{$typekey}-#{$sizekey} {
      #{$type}: $size * $spacing-base-size;
    }
  }
  //.mx-1
  @each $sizekey, $size in $spacing-sizes {
    .#{$typekey}x-#{$sizekey} {
      #{$type}-left: $size * $spacing-base-size;
      #{$type}-right: $size * $spacing-base-size;
    }
    .#{$typekey}y-#{$sizekey} {
      #{$type}-top: $size * $spacing-base-size;
      #{$type}-bottom: $size * $spacing-base-size;
    }
  }
  //.mt-1
  @each $directionkey, $direction in $spacing-directions {
    @each $sizekey, $size in $spacing-sizes {
      .#{$typekey}#{$directionkey}-#{$sizekey} {
        #{$type}-#{$direction}: $size * $spacing-base-size;
      }
    }
  }
  .#{$typekey} {
    #{$type}: 0;
  }
}
ÏîÄ¿´úÂë/BigScreenVue/src/common/echart/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
<template>
  <div :id="id" :class="className" :style="{ height: height, width: width }" />
</template>
<script>
import tdTheme from './theme.json' // å¼•入默认主题
import '../map/fujian.js'
export default {
  name: 'echart',
  props: {
    className: {
      type: String,
      default: 'chart'
    },
    id: {
      type: String,
      default: 'chart'
    },
    width: {
      type: String,
      default: '100%'
    },
    height: {
      type: String,
      default: '2.5rem'
    },
    options: {
      type: Object,
      default: ()=>({})
    }
  },
  data () {
    return {
      chart: null
    }
  },
  watch: {
    options: {
      handler (options) {
        // è®¾ç½®true清空echart缓存
        this.chart.setOption(options, true)
      },
      deep: true
    }
  },
  mounted () {
    this.$echarts.registerTheme('tdTheme', tdTheme); // è¦†ç›–默认主题
    this.initChart();
  },
  beforeDestroy () {
    this.chart.dispose()
    this.chart = null
  },
  methods: {
    initChart () {
      // åˆå§‹åŒ–echart
      this.chart = this.$echarts.init(this.$el, 'tdTheme')
      this.chart.setOption(this.options, true)
    }
  }
}
</script>
<style>
</style>
ÏîÄ¿´úÂë/BigScreenVue/src/common/echart/theme.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,490 @@
{
  "color": [
    "#2d8cf0",
    "#19be6b",
    "#ff9900",
    "#E46CBB",
    "#9A66E4",
    "#ed3f14"
  ],
  "backgroundColor": "rgba(0,0,0,0)",
  "textStyle": {},
  "title": {
    "textStyle": {
      "color": "#516b91"
    },
    "subtextStyle": {
      "color": "#93b7e3"
    }
  },
  "line": {
    "itemStyle": {
      "normal": {
        "borderWidth": "2"
      }
    },
    "lineStyle": {
      "normal": {
        "width": "2"
      }
    },
    "symbolSize": "6",
    "symbol": "emptyCircle",
    "smooth": true
  },
  "radar": {
    "itemStyle": {
      "normal": {
        "borderWidth": "2"
      }
    },
    "lineStyle": {
      "normal": {
        "width": "2"
      }
    },
    "symbolSize": "6",
    "symbol": "emptyCircle",
    "smooth": true
  },
  "bar": {
    "itemStyle": {
      "normal": {
        "barBorderWidth": 0,
        "barBorderColor": "#ccc"
      },
      "emphasis": {
        "barBorderWidth": 0,
        "barBorderColor": "#ccc"
      }
    }
  },
  "pie": {
    "itemStyle": {
      "normal": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      },
      "emphasis": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      }
    }
  },
  "scatter": {
    "itemStyle": {
      "normal": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      },
      "emphasis": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      }
    }
  },
  "boxplot": {
    "itemStyle": {
      "normal": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      },
      "emphasis": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      }
    }
  },
  "parallel": {
    "itemStyle": {
      "normal": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      },
      "emphasis": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      }
    }
  },
  "sankey": {
    "itemStyle": {
      "normal": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      },
      "emphasis": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      }
    }
  },
  "funnel": {
    "itemStyle": {
      "normal": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      },
      "emphasis": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      }
    }
  },
  "gauge": {
    "itemStyle": {
      "normal": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      },
      "emphasis": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      }
    }
  },
  "candlestick": {
    "itemStyle": {
      "normal": {
        "color": "#edafda",
        "color0": "transparent",
        "borderColor": "#d680bc",
        "borderColor0": "#8fd3e8",
        "borderWidth": "2"
      }
    }
  },
  "graph": {
    "itemStyle": {
      "normal": {
        "borderWidth": 0,
        "borderColor": "#ccc"
      }
    },
    "lineStyle": {
      "normal": {
        "width": 1,
        "color": "#aaa"
      }
    },
    "symbolSize": "6",
    "symbol": "emptyCircle",
    "smooth": true,
    "color": [
      "#2d8cf0",
      "#19be6b",
      "#f5ae4a",
      "#9189d5",
      "#56cae2",
      "#cbb0e3"
    ],
    "label": {
      "normal": {
        "textStyle": {
          "color": "#eee"
        }
      }
    }
  },
  "map": {
    "itemStyle": {
      "normal": {
        "areaColor": "#f3f3f3",
        "borderColor": "#516b91",
        "borderWidth": 0.5
      },
      "emphasis": {
        "areaColor": "rgba(165,231,240,1)",
        "borderColor": "#516b91",
        "borderWidth": 1
      }
    },
    "label": {
      "normal": {
        "textStyle": {
          "color": "#000"
        }
      },
      "emphasis": {
        "textStyle": {
          "color": "rgb(81,107,145)"
        }
      }
    }
  },
  "geo": {
    "itemStyle": {
      "normal": {
        "areaColor": "#f3f3f3",
        "borderColor": "#516b91",
        "borderWidth": 0.5
      },
      "emphasis": {
        "areaColor": "rgba(165,231,240,1)",
        "borderColor": "#516b91",
        "borderWidth": 1
      }
    },
    "label": {
      "normal": {
        "textStyle": {
          "color": "#000"
        }
      },
      "emphasis": {
        "textStyle": {
          "color": "rgb(81,107,145)"
        }
      }
    }
  },
  "categoryAxis": {
    "axisLine": {
      "show": true,
      "lineStyle": {
        "color": "#cccccc"
      }
    },
    "axisTick": {
      "show": false,
      "lineStyle": {
        "color": "#333"
      }
    },
    "axisLabel": {
      "show": true,
      "textStyle": {
        "color": "#fff"
      }
    },
    "splitLine": {
      "show": false,
      "lineStyle": {
        "color": [
          "#eeeeee"
        ]
      }
    },
    "splitArea": {
      "show": false,
      "areaStyle": {
        "color": [
          "rgba(250,250,250,0.05)",
          "rgba(200,200,200,0.02)"
        ]
      }
    }
  },
  "valueAxis": {
    "axisLine": {
      "show": true,
      "lineStyle": {
        "color": "#cccccc"
      }
    },
    "axisTick": {
      "show": false,
      "lineStyle": {
        "color": "#333"
      }
    },
    "axisLabel": {
      "show": true,
      "textStyle": {
        "color": "#fff"
      }
    },
    "splitLine": {
      "show": false,
      "lineStyle": {
        "color": [
          "#eeeeee"
        ]
      }
    },
    "splitArea": {
      "show": false,
      "areaStyle": {
        "color": [
          "rgba(250,250,250,0.05)",
          "rgba(200,200,200,0.02)"
        ]
      }
    }
  },
  "logAxis": {
    "axisLine": {
      "show": true,
      "lineStyle": {
        "color": "#cccccc"
      }
    },
    "axisTick": {
      "show": false,
      "lineStyle": {
        "color": "#333"
      }
    },
    "axisLabel": {
      "show": true,
      "textStyle": {
        "color": "#999999"
      }
    },
    "splitLine": {
      "show": true,
      "lineStyle": {
        "color": [
          "#eeeeee"
        ]
      }
    },
    "splitArea": {
      "show": false,
      "areaStyle": {
        "color": [
          "rgba(250,250,250,0.05)",
          "rgba(200,200,200,0.02)"
        ]
      }
    }
  },
  "timeAxis": {
    "axisLine": {
      "show": true,
      "lineStyle": {
        "color": "#cccccc"
      }
    },
    "axisTick": {
      "show": false,
      "lineStyle": {
        "color": "#333"
      }
    },
    "axisLabel": {
      "show": true,
      "textStyle": {
        "color": "#999999"
      }
    },
    "splitLine": {
      "show": true,
      "lineStyle": {
        "color": [
          "#eeeeee"
        ]
      }
    },
    "splitArea": {
      "show": false,
      "areaStyle": {
        "color": [
          "rgba(250,250,250,0.05)",
          "rgba(200,200,200,0.02)"
        ]
      }
    }
  },
  "toolbox": {
    "iconStyle": {
      "normal": {
        "borderColor": "#999"
      },
      "emphasis": {
        "borderColor": "#666"
      }
    }
  },
  "legend": {
    "textStyle": {
      "color": "#fff"
    }
  },
  "tooltip": {
    "axisPointer": {
      "lineStyle": {
        "color": "#ccc",
        "width": 1
      },
      "crossStyle": {
        "color": "#ccc",
        "width": 1
      }
    }
  },
  "timeline": {
    "lineStyle": {
      "color": "#8fd3e8",
      "width": 1
    },
    "itemStyle": {
      "normal": {
        "color": "#8fd3e8",
        "borderWidth": 1
      },
      "emphasis": {
        "color": "#8fd3e8"
      }
    },
    "controlStyle": {
      "normal": {
        "color": "#8fd3e8",
        "borderColor": "#8fd3e8",
        "borderWidth": 0.5
      },
      "emphasis": {
        "color": "#8fd3e8",
        "borderColor": "#8fd3e8",
        "borderWidth": 0.5
      }
    },
    "checkpointStyle": {
      "color": "#8fd3e8",
      "borderColor": "rgba(138,124,168,0.37)"
    },
    "label": {
      "normal": {
        "textStyle": {
          "color": "#8fd3e8"
        }
      },
      "emphasis": {
        "textStyle": {
          "color": "#8fd3e8"
        }
      }
    }
  },
  "visualMap": {
    "color": [
      "#516b91",
      "#59c4e6",
      "#a5e7f0"
    ]
  },
  "dataZoom": {
    "backgroundColor": "rgba(0,0,0,0)",
    "dataBackgroundColor": "rgba(255,255,255,0.3)",
    "fillerColor": "rgba(167,183,204,0.4)",
    "handleColor": "#a7b7cc",
    "handleSize": "100%",
    "textStyle": {
      "color": "#333"
    }
  },
  "markPoint": {
    "label": {
      "normal": {
        "textStyle": {
          "color": "#eee"
        }
      },
      "emphasis": {
        "textStyle": {
          "color": "#eee"
        }
      }
    }
  }
}
ÏîÄ¿´úÂë/BigScreenVue/src/common/map/fujian.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/
(function (root, factory) {
  // eslint-disable-next-line
  if (typeof define === 'function' && define.amd) {
      // AMD. Register as an anonymous module.
      // eslint-disable-next-line
      define(['exports', 'echarts'], factory);
    } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}(this, function (exports, echarts) {
    var log = function (msg) {
        if (typeof console !== 'undefined') {
            console && console.error && console.error(msg);
        }
    }
    if (!echarts) {
        log('ECharts is not Loaded');
        return;
    }
    if (!echarts.registerMap) {
        log('ECharts Map is not loaded')
        return;
    }
    echarts.registerMap('福建', {"type":"FeatureCollection","features":[{"id":"350100","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@K@KLDBLBBIHCAA"],["@@CBABCD@FJFCFBDHFFBB@FM@CCEBCCEMC"],["@@ACCBBDDA"],["@@@CC@@DD@"],["@@B@A@"],["@@MCKEO@ICCCAEAKBKAAIAC@AVFPCRBBFBNHNBVXJ@DADCHAB@@GBCL@B@BCCIEEBC@CHCACG@ABKPA@CC"],["@@@A@B"],["@@A@CDC@WH@FLXCB@DFDATBFH@HELA@CCACI@AFAD@BA@AH@DED@FDBHHHJDT@JC@AEOECGKC@EDOQIACBG@CC@CKC"],["@@B@BCE@BD"],["@@J@BA@AAAI@ABBD"],["@@B@@ACABD"],["@@B@@AA@@B"],["@@B@AC@@@D"],["@@BAA@@B"],["@@@A@B"],["@@BAA@ABB@"],["@@DA@CCB@D"],["@@MDFFAFBH@BCFCDBN@BHFDJJHFBDCDMCCE@AA@EHOD@HDDABC@ECCGDCEGAGACC@G@A"],["@@B@@AA@@B"],["@@B@@AA@@B"],["@@B@A@"],["@@B@A@"],["@@B@AC@B@B"],["@@BA@AAB@B"],["@@BA@CC@ABCCC@@BDDHB"],["@@BKCEEAEF@HBDHDDA"],["@@E@AFCBC@CCABACA@AACFB@@BADQAALDDAB@JBFADLADGAC@@PBHF@@DCAAAECEJCDDAFBDCDBLDBBA@AAADAAADA@ADBDACGDACADCAADEGKE@AA"],["@@ABBBAFEBQBEDQBABCJOLEHD^NF\\BLGFMH@FKD@LBPENB@A@CM@CAAE@CBA@CE@A@@ABA@EDAAKE@MEC@"],["@@@HCBEAEJAH@BDDL@DCFDNBB@@CFBDEEEGGG@A@BCEEEA"],["@@ABFLAB@DJDFNDDJ@BCDAFHBBFC@CGEBCKEA@BEIC@CCBADIIA@ACC@"],["@@FD@A@CAC@ACABFAD"],["@@C@@BDDD@@FBB@DAB@B@BB@BA@AF@@CFEIEIC"],["@@BDHBB@CGBGEADAACCCEACCC@@DE@@DHDBFHJ"],["@@@AA@BB"],["@@FFB@@CACC@AB"],["@@ABD@@BB@HACCABE@"],["@@BBJ@DBDAAEA@CAABC@ACCH"],["@@ABBBF@AACA"],["@@@DFJDBFFHDB@@ECCEGEACEE@"],["@@DHDBD@FADCCEFAFBB@HKBECCEDC@A@CF@@AGEECCCGABABABCAEBAABCAAA@GH@DDDAFF@BBADGBECABARA@CGCECBABBFAFJD@HBBD@JABCDC@EAI@AF@FBF@@F"],["@@CBD@BAA@"],["@@B@@AA@@B"],["@@DBBACAAB"],["@@DFDAACA@AEA@@F"],["@@DB@CC@ABB@"],["@@FNFAFFFACGA@ACC@EEE@@B"],["@@@DBBF@AECAAB"],["@@BDB@@CBAEEA@BH"],["@@BBD@@ACCDAE@@D@B"],["@@JB@@AAE@CA@BB@"],["@@BDDBBAAC@CC@ACA@BH"],["@@DD@CD@ACC@AD"],["@@FDH@GEEB"],["@@C@ADHBBF@@DAFBCEIE"],["@@BCAEBA@IECABBJEHID@FMFBBBBBFD@FFD@D@@HBBF@RADCBE@CGCEBAAGG@CBC"],["@@B@@BD@@CAAAA@BAD@@"],["@@BDAE@B"],["@@CFDDD@DAJ@D@BAACBACC@EAACBABKH"],["@@BB@AA@"],["@@DBBGAAA@CA@BDFAB"],["@@@BDFDBB@CGEA"],["@@@BB@@AA@"],["@@EDBDB@FA@EC@"],["@@CF@DADDFB@BA@CBBHBBABAD@ACAABEAAEAIB"],["@@@@@A@B"],["@@BBBA@ACB"],["@@DB@CA@AB"],["@@DDB@@ABACCABAB"],["@@ABBBD@@CD@@ACACD"],["@@BBDAAEE@BF"],["@@@BB@AA@@"],["@@JFB@CEG@"],["@@@DFBAEC@"],["@@@DD@ACA@"],["@@ABFB@CC@"],["@@B@B@AAAB"],["@@BDB@ACA@"],["@@B@@@A@"],["@@JHB@ACGCA@"],["@@DDHFBBDCFDD@JHDA@@KKCAACEBEGGCABBDCD"],["@@DFNJHBJOJEBACGIACCK@CACBCCC@CDADDP"],["@@ADBBHAAABCAAED"],["@@@BBA@AAB"],["@@HBBCAEGF@B"],["@@HHB@GIAB"],["@@P@@A@CECM@@DDF"],["@@IKGACD@FNLHJHB@EGM"],["@@A@CDG@CBC@EFIDBBAD@BDDFA@FDFD@BICKDAD@JNDBBJAB@BPH@BJJF@FDAHHDF@DAJDBDB@@GCA@CBCCMIKBCE@CA@GECE@IEE@@ABACGIEC@"],["@@BA@ACBBB"],["@@BCAAAAC@DHB@"],["@@DB@CBAE@@D"],["@@@@@@"],["@@FAB@BCAAE@CDBD"],["@@JNPJF@DABAAI@ADAVHZFFBHJJDF@DA@EEI@EFG@C@A@KAEECEAC@GBIJC@IGQA@BC@GEEBE@GCABADMJC@@BAHBD"],["@@DDBA@CCAAB@B"],["@@BAAB"],["@@DBBA@CC@AD"],["@@JFBCDA@AACIACD@D"],["@@@BDAC@"],["@@B@BAA@AB"],["@@BBDBAEAAA@@D"],["@@@DHBBMCG@AAAC@AFBN"],["@@BBBCA@AB"],["@@@BBB@CA@"],["@@@DD@AEC@BB"],["@@BBBAACC@BD"],["@@BBB@@C@AG@DD"],["@@@BB@@CAB"],["@@BBBCC@@B"],["@@BBB@ACAB"],["@@@B@A"],["@@B@@AAB"],["@@BDF@CECB"],["@@ABDBBCC@"],["@@ABDBDEA@CB"],["@@@BBBDAAAC@"],["@@D@AAAB"],["@@E@@FB@@ADA@A"],["@@@BF@DEC@ED"],["@@DDD@@ACAC@"],["@@B@B@AAAB"],["@@HHDAAACEE@@B"],["@@B@AA@B"],["@@BDB@BCCAAB"],["@@FBAAC@@@"],["@@B@AAA@BB"],["@@BBF@B@@EEACB@D"],["@@BDB@@EC@@B"],["@@CDBBDAAC"],["@@CD@F@BDAHA@CD@@E@AC@GD"],["@@FFB@@ACGA@AD"],["@@ADB@BCA@"],["@@@BF@AAC@"],["@@@DBCA@"],["@@@AAAADD@"],["@@DIF@ACCBCAC@@DCBALA@@DF@FG"],["@@BDD@CI@@AF"],["@@@@@@"],["@@@BB@@AA@"],["@@BHBBFA@AAABCCCBCAAA@ABC@@FBB"],["@@CB@BF@@AAA"],["@@ADBDB@FMC@CF"],["@@ADBBDEC@"],["@@@BBAA@"],["@@ADD@@CA@"],["@@AB@BBC@@"],["@@B@@AAB"],["@@@B@A"],["@@@BDAC@"],["@@@BBDFADB@CE@ACCA@D"],["@@J@BCCCG@@H"],["@@A@@DBC@@"],["@@@EAACFAAAFBBBCF@"],["@@EDADD@DABBD@@EEA"],["@@@BBFCBC@A@ERBBJ@FBF@EFE@@DDBN@HED@FBCFFBBDD@JC@CEEBCAANCBCB@@CKEEEOAGCADE@ME"],["@@@BBBF@@CAAEB"],["@@@BBBBECA@D"],["@@ABBBDCCA@B"],["@@GDDFHABAACCA"],["@@BDB@DA@CAAA@CD"],["@@DB@CAAAD"],["@@ABBBHACAC@"],["@@DHH@BA@EFBBA@ICCACCBE@@FEF@D"],["@@DFHDBAACCCCACB"],["@@@DFBD@@CAAGA@B"],["@@B@@AA@@B"],["@@@DF@ACDCAGA@@FCF"],["@@@DDBDCBAAAE@AB"],["@@@BDAC@"],["@@DBBAEAABB@"],["@@ABBBBAAA"],["@@DBB@AAC@"],["@@@BB@@CA@@B"],["@@B@AA@B"],["@@@@@@@@"],["@@ADDADDDB@GEEE@BF"],["@@ADFBFBDA@ACACECBAB"],["@@BFFGCAA@AD"],["@@AB@BDCA@"],["@@B@@CE@AD@@F@"],["@@CDM@@BDBAFFBBDBB@FFDRFLDAK@ICEHKACGACBABC@K@"],["@@DBDA@CEAAB@D"],["@@DDAEA@@B"],["@@CCA@DLB@DCBCE@"],["@@BBBCCAABBB"],["@@BBBAAAAB"],["@@@BDJDBDDDACEBCDAHCBAEACDQ@"],["@@@DDAAAA@"],["@@AB@BFCA@A@"],["@@@BB@AA"],["@@@AAB@@B@"],["@@DBCA"],["@@@BB@@CAB"],["@@ADD@@CA@"],["@@AB@DDCAA"],["@@AAABD@"],["@@f•f¯BGEOBGBCLKbqBEBOBCRORQBAIKAEBEVEZ@\\HjRXJ\\@FA@COeCEe_aUGEAOEEKAIAmDQEG@A@CRCDGFSDG@…]GGBILENADC@EAIEIYWIACBMLOPIFI@Ÿ_YCYAmGECGG@KDGRQBE@EAGUMAC@UAIEEoM]_YISKAM@MFILIFcFKBCNEPARM@ECEJYR@BWHMJyH]BEFAHBdNH@F@NERGLODMAiCUIaYOuCIGCSC{CMCICEEEGGWGeAeD{D‡HMBCH@DOAGCEQKEIEEMGCCEOCAAEEA@EJCBGFC@AQcQIUA‘JaA‰SAKMEKBGEAE@IHMDUAIBA`BNMFAJFF@^EFBHJJ@FCBGAQFM@GACQSACDKJ@REVBTCJDJDPNJBL@DAHMEQ@ATOFQHC@GAGHWBKCGKKAKDWFELKJM@E@EGG@GBADAJ@FDTVLDDABA@]BAlJHV@BEB@HHFBFVHFPDDTFREF@JDBD@DSHABDLCH@F@DH@@V@LKXELcPALIJAH@JJHH@BJLLBHXND@FAD@DBBPDHHFTJXFTLBH@@HAjZF@FAFG@KCEYa@C@GDOJMDAJA\\HLAD@HIFCH@PKPGFG@ECCECCIIK@ADCH@PMhKN@ZLH@DA@EE[GKYUKEGAI@CDGPGDIBiSGECCEUAWDODGBCXCDCDIDEBANDDBB@JCDIPHBDB@FEAKBIKS@KEEK@EBABCLCFAB[FGAECCEKCEBIAKIKCc[IAGACCEO@MHCN@FCLAFC@GMC@KEABCACE@EBCAAB@DA@GCE@SPCHAHGDCFSBIFKAKPKDW@C@@B@DVD@FAHEBAEM@CBEHGDCD@DNR@FG@CAC@IL@D{OAA@GCKCIYMG@CC@CHEPADAH@BBBHD@D@JILA@FAHBHF@F@FBFCDE@SDI@AEG@MEAIBGA@KAC@EJ[DC@MDA@AGEBEAAA@GHC@SMQCKE@CDAVBTHHHF@BA@CCMGIECEG_IWBABMBEAMIIAEBCHKN@HDBLBQXIV@LBFJLDRCFAPIDCH@LHJCDIFADDH@NCJGFMAEAEECEBEGUHIFADADE@IBAH@DBDEDKDI@AGEMECIAEACIEGBECAKEABG@CEEIAMEE@@JDF@D@HEBEBO@KAGIQEEQC@QHCD@JJP^XDD@HENQVGFGBCDBNJfCFGDE@GA]BCACIGOQSG[EACDBTCJON@DPJTT@HIFA@AHDVBFHHJ^AFGDMBI@OSAAEAiHEDATEFsVIFIDIAEIGUKsAODOJYJO@EBQAICCI@CECBCDGHO@IGG[IEIDM@OASBWTOJKVA`JZJRHFGDMEIBEF@TA@o]AIO@EAEJA@GACBADFJ@DELCD@DDBLANCD@LVBFENB@JCF@DDDBDDAHFP@FGNMT@PIJAPIGGCQOIGCCADAHIBIFICGBCBKRMDCRSTBBBBJBFGFCB@BHCPEB@EAAC@C@DN@DADEBIB@HBB@BBDGDALMFGFMR@HAH@JJTFPFJANFBHAJ@BBCFIBIJETBDNBDBBDCHADGAAHADEBI@@HIAAABAEC@BCB@A@AABBHHFPNJDJHLT@DABIDG@EBEBGHMGEHkDEAKGAACBCLA@CAEGGCKDCD@HEC@EgGMK_BSIACmAIGKDMAEEEIMCCCAGOGANDTDHBFCPEF@D@HDDF@DB@DADCBC@MG@GGGG@ICIOMMAKIACAQCGECBCGCCCEKGIIEAEEC@ABHL@FGBCCO@OGC@MDADEBG@QLEHADW@EBEGOI@AHABAMSUMWIICMBIDMNCBCA@CBEBGCGIGMAIMEEE@GBADL`@NCBUOI@EGCAKF@HA@CCIFAJSAMBED@BBBHFON]FO@EAI@ECACAOICEBIHIDAJABC@CA@EDMCAEDCA@CBOAGEAGAADELABGACA@MCGCAGPEBEAAC@CJIGEC@INUKIFOMCGDEEEGCYAEBCLKJGLGFC@IJKJALUPAJWFMJGJA@CBKEGBIFQRGV@LBBARCHIHCH@JG`EJSHGFKRMCEF@FVXDP@NDLD@LEHDLNF@HF@DEJIZABKFADBDJBCLDFN@BDCJV\\LNHC\\ULOFAFCBCI{BAJHP@FHBZCFAHAFC@AFBDJHHBPINALCP@JO@AACD@HB@BKPCJEBHHALBFNRDJAFG@AFDTHLAHDFKLBDDFDFEF@FEDJTBHCXGF@L@BH@ETBFJJBZIPAHAHBB\\CpBnHJ@XSRFONBHJHFNCBGCGBAFE^CBEFAN@LAFFHFLAFDD@FCBSGG@GFGNA`FL@LCFBD@LD@PGDBDDITDJDHBDCFBDABBB@BF@FDBB@DBB\\BTKFLIHKTEFPLFHDAhANINGLANJD@HCBDDLFHBDCDHB@F@NK`BHABHJVJDDCJH@D@@DD@BADCF@DBBD@DABKDBZDDNJFFHDHHR\\|AFABA@ENE\\EFB\\RHDDVDJBJEHQLE@EBCDGLIHDHEFGFQBEDAFDF@JJBELJPEDSH]PGFHNBFCRDJ@RBFHFD@HJRHBHAHIBBLCDEB@B@HDHVAFBD@DCHAT@FEFIEKBAJAPENEDG@]OK@CXSDEACC@@E@KFKJGJAL@XHbTJNBLPHDD@J@D\\HDDHDbJLAVBF@PSHEN@LHH\\ALEFOAEFAHDLPNDVFJLFRH`BFAJGF@DBBDFB@DEHBDFF@DOP@DDDFDD@LEHF@BCJBDJJ@DE@AD@HHBBDBNFBJED@@DANHD`CJ@DBNND@DADENIFEFE@EACIAKGEGAEDCRGL@PDB@DCDAJBBB@LDBD@@GDCAEFGACAAJADEBCFCAIFG@CDCHBFABB@DDBT@DAHGBBBHHBF@FCHBDAD@BFJJD@H@NFDDJNHDFJDBNEDENYHG@SDCNSFAD@ZHJJJZDFHAVIJGBCJCDDH†HRVXFBF@VA@GFABAAIE@CE@CB@HD@CFCBFFBB@DAHDFH@FJFJAFFAFED@B@DBBH@DC@LDAH@DCDAVDFFJP@NBFPBNAJCJADAH@JDAHYJABBBH@BB@DDBLANOFANBVDNFT@HADCF@FB@DFBTKLC@EXBDCJKAC@INQJCBILELQ@AKIPUDCN@^KBC@EECDCDAJDFANKRBHGF@HFF@NEFCDC@EFA@CB@NABAAE@ADAF@RFNHDAHBPEJ@FBBH@DDHF@FENF@DPpDDFBJ@NJVEH@FAXKJDTPDBGF@DDBLA\\DJATMJCDGTKBGJM"]],"encodeOffsets":[[[121678,27068]],[[122867,26893]],[[123104,26891]],[[123102,26881]],[[122918,26872]],[[122887,26845]],[[122899,26847]],[[122808,26762]],[[123295,26793]],[[122500,26759]],[[122597,26600]],[[122653,26290]],[[122432,26267]],[[122495,26224]],[[122330,26023]],[[122337,25968]],[[122386,25960]],[[122568,25912]],[[122491,25946]],[[122489,25944]],[[122479,25933]],[[122477,25932]],[[122575,25918]],[[122572,25914]],[[122600,25884]],[[122600,25866]],[[122778,26197]],[[122515,26757]],[[122816,26587]],[[122847,26569]],[[122779,27057]],[[122762,27045]],[[122794,27053]],[[122756,27019]],[[122755,26998]],[[122828,27009]],[[122848,27000]],[[122971,27014]],[[123107,26964]],[[123388,27005]],[[122776,26927]],[[122780,26924]],[[122774,26924]],[[122896,26865]],[[122900,26866]],[[122880,26870]],[[122857,26818]],[[122855,26792]],[[122703,26916]],[[122688,26897]],[[122685,26889]],[[122705,26880]],[[122597,26897]],[[122598,26867]],[[122549,26752]],[[122532,26772]],[[122538,26773]],[[122508,26742]],[[122877,26603]],[[122846,26566]],[[122564,26378]],[[122535,26397]],[[122528,26369]],[[122546,26375]],[[122686,26379]],[[122731,26321]],[[122734,26322]],[[122700,26282]],[[122700,26286]],[[122708,26284]],[[122643,26330]],[[122631,26281]],[[122600,26328]],[[122566,26286]],[[122561,26282]],[[122575,26281]],[[122577,26283]],[[122534,26303]],[[122539,26306]],[[122511,26289]],[[122521,26281]],[[122483,26327]],[[122477,26331]],[[122496,26319]],[[122487,26291]],[[122494,26291]],[[122458,26284]],[[122450,26243]],[[122414,26223]],[[122416,26230]],[[122478,26197]],[[122483,26194]],[[122473,26208]],[[122535,26263]],[[122567,26229]],[[122588,26246]],[[122671,26268]],[[122676,26263]],[[122686,26264]],[[122691,26237]],[[122726,26231]],[[122737,26209]],[[122786,26210]],[[122722,26189]],[[122715,26193]],[[122751,26184]],[[122716,26129]],[[122701,26140]],[[122691,26129]],[[122691,26122]],[[122699,26124]],[[122696,26122]],[[122542,26118]],[[122578,26154]],[[122582,26156]],[[122583,26146]],[[122580,26168]],[[122590,26165]],[[122580,26144]],[[122571,26142]],[[122568,26189]],[[122479,26187]],[[122495,26125]],[[122497,26125]],[[122499,26129]],[[122500,26143]],[[122545,26107]],[[122532,26091]],[[122519,26069]],[[122539,26058]],[[122556,26069]],[[122511,26041]],[[122587,26026]],[[122681,26067]],[[122677,26060]],[[122686,26053]],[[122695,26033]],[[122691,26034]],[[122693,26038]],[[122818,26043]],[[122753,26083]],[[122747,26086]],[[122725,26100]],[[122643,26003]],[[122650,26004]],[[122634,25999]],[[122631,26000]],[[122628,26000]],[[122620,26011]],[[122548,26022]],[[122539,26005]],[[122542,26007]],[[122602,25961]],[[122588,25985]],[[122578,25962]],[[122579,25943]],[[122579,25951]],[[122570,25955]],[[122565,25953]],[[122556,25945]],[[122648,25899]],[[122646,25905]],[[122632,25906]],[[122619,25901]],[[122600,25885]],[[122442,26033]],[[122436,26036]],[[122438,26056]],[[122438,25999]],[[122455,26007]],[[122420,25975]],[[122403,25968]],[[122376,25971]],[[122375,25972]],[[122375,25975]],[[122470,25938]],[[122346,25914]],[[122355,25916]],[[122358,25920]],[[122351,25932]],[[122342,25940]],[[122331,25960]],[[122336,25979]],[[122230,26022]],[[122230,26020]],[[122245,26043]],[[122256,26046]],[[122280,26060]],[[122299,26064]],[[122846,26708]],[[122684,26856]],[[122684,26858]],[[122686,26859]],[[122689,26858]],[[122586,25928]],[[122556,26196]],[[122676,27184]]]},"properties":{"cp":[119.206239,26.075302],"name":"福州市","childNum":197}},{"id":"350200","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@C@@DJ@@AEA"],["@@QDKHAHJPLBJIFCDCBE@GCCGA"],["@@BFF@@CCACA@B"],["@@JDFFJ@HCFDDABAAAC@AEMAC@GCGBCF"],["@@FDJC@AEBECAGA@AACB@BHDAF"],["@@FcAIO[•…MOMKQAcDUFaNIJKTMNAFCP@HHNFjTxBHJXJNHHXNfHJDNBFAFEJQFC^ClQNKFIDOB["],["@@iDoCEBSHKREDQBEDONKTCLHV@@CBABHHBHAJBBG`E@AFOHCHCBEAEBADCPEHKHCBO@GD@LBJBDGHAFDRFF@HEHEDMHMLMHADJFDJ@J@FALDBBBNCPDRADBTfJHNFLLJDDDDNDH@DAJLDDF@FCNK\\CNBLABMFCFIhARFLDTDHJDFBALHJDLBNAXALGNF@DBBF@FABAFDJAFFTIFCBSCG@EBWbMHQLBJBDFDH@H@DCJGFKBAXJTEHIHQHEDGDAHHF@ZLLDBBONAD@DLNL@RCDBBFCHOJSDGF@FDFHBZMHADDBPFBXGLBFADEAQDGLKHMFEHAFDHNH@DABE@SDMFAPTrXBAF@LTLHTLFBLEN@LB@FJDN@JADADEDAD@DDJCNBRUAAKAEM@EFGTKLCHGTGBIACEEBELODIDAFAH@FBDLHBF@DGFBDADCF@FBHHTDH@JERCFCHWFCHMLEHEHACGHEAEGIBCRMD@BFDDDBFCDE@KA@CBCBCACE@EFEESCCC@CDSAEE@EDCFUDANADCJMAG]iAEDCHGXM@EAGBC\\QA_OMHWCQEEIAEOCCEE@CDIDBFBJNB@BC@GCQLGLEBEBKBAJ@DW@]IUEGOGkG‰GsMkGl]ZgZOZIJKNICOGaOQMMUOGGIIOIKUO}AEQSGSEu"]],"encodeOffsets":[[[120993,25143]],[[120906,25022]],[[121027,25035]],[[121218,25145]],[[121249,25142]],[[121042,25093]],[[120883,25005]]]},"properties":{"cp":[118.11022,24.690474],"name":"厦门市","childNum":7}},{"id":"350300","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@ABG@DFAFHDDH@B@BF@@CHBBCAAHCAGDC@CE@GBMC"],["@@@FAAGDBNDFD@@EBA@CBCB@DBDAGGA@CC"],["@@F@@ACAAD"],["@@EBMLCF@FHBLEDEDG@CAAAA"],["@@B@A@@@"],["@@BBB@ACAB"],["@@BDD@CCA@"],["@@BBB@ACAB"],["@@DBFAFCCCE@ED@D"],["@@KDADDBDADDHCBA@CGA"],["@@T@BA@AECC@KFG@@DB@FA"],["@@@BDFBCDDDABCACMB"],["@@@BBBF@BAJAACB@@ACCKAGDABBDDB"],["@@FD@BD@@GI@A@BB"],["@@@FBBH@BA@IF@@EBCC@CDAACDAAC@AFBD"],["@@AEEBCCEAADDJA@A@@FB@FAF@@BBBFGAC"],["@@FBDAAAC@C@@B"],["@@CD@BFBBHH@B@AC@AJ@CCBA@ACCA@CDIA"],["@@HDBCGAAB@@"],["@@FHADDBDIAGEACF"],["@@@BEBAFDBJLBAAGH@@CEEAMGB@DBD"],["@@OJ@FJAZK@AAEC@MF"],["@@ADBFFDHABEAAEIA@E@BDAB"],["@@BHFBBBD@BEACGCDC@AA@GF@B"],["@@ADCBBBD@BC@AAA"],["@@BAACABBD"],["@@@BBDAFDBDBBDPI@C@CGEIAGF"],["@@RDDAACCACEE@ACAHIFBBFA"],["@@YDI@SFETDJFFBFOR@D@HDDD@JEHADDBHDHDDD@JADB@HBJFHFBJEDEBIAECA@CBAFCFBBBABBDDBJAHCDEAQBSDIJER@BGDEbKL@BDDHDFDABEBAHBDED@FBFHHDPAFABC@CECA@AAFGEEEAIAIBEFCACEDQ@AMDCC@CNSCGDC@AICGAW@QGA@ABBHADCDGFODAB@FCD@DDFABKDG@GDIDGAGHSJ"],["@@FJFFFBH@LCJHnBBDTJ`ANLhH@FFD@GDCLCHDFHDBB@DKDABBLHNBdCFGNHHGFAFAH@JCBAAGIOIGICOMGEAEBC@DDA@AFDABBBJB@GJ@FABCBGHBBCDGACCAMAACFSJIJADEAAI@GBEABMEIEOIS@IBG@GNQHENEBKHCAC@AAA@GJAFABC@CCMD@D@BB@FFADOAGA@EDEHIAAAAATSDQNCLQDAHAJDJEJADKDDJHRPHDJHBOJI@ONSHM@EEOBGAAECCCE@IDA@FMAEKUC@MDKBCC@ADCFK@CEIBCDAHBB@FIMIuSqYEGOUKkAaBELCJBNFD@HE@MDCpMPAFDDBXEHKBC@IFCBCAKBGPS@OJG@EDAFAFBBJCZBDD@F@HATIHATBJBFBPAFCXgnkHGVEN@HIVGH@PHF@BAEIAIAKBMACCCYIIEIA]BGACE@IEAQDMHGBKEC@EFI@EAAEFI@CAC@EFKBKDKJMNEDGCCGAEEIMCAC@ADEAYQGMOEEB@JED@DDFADqVIFEBWCWOSEQ@ODGFOHEDEJcZGJCHBLAHEDMCEGEIMECC@EGGAIAAEB@CJYLOR@NIN@DCDGAMGECBAABEFCHEF@B@JHN@FCDGCeBG@EK_@KAKIAIKKECAAI@KHMEEAEBCL@BC@GAAGAAGGCAGGICUICFKAE@@K@C@@HBJALGDEFKBCDBDHD@BCHCBODOLADFDJ@ZIHBDDDD@DO\\EHBDDDJ@HPLFJJFBTBDB@DAFIFG@©FMQSFSNGNUHKJM\\AVBLANDPDDFFB@TIRCJBHJPXBJBbDHLHBHU\\_EI@GAIIEASBIAACCOAEEEOIKAKDICE@AFBNQREH@JDHHJFDBH@LBJHHDNDBLGFGBEBAHALDFHDDDHAHEHKBMAOFIBGCIIC@Q@IBK@GDG@CCCGCAiSGAKDI@MIGMIE[CUBACICBKAGGGQAECGIC@ADDH@FOBE@BGCACAIAEASBICGBKCEBBHMEGCQECCEKDQ@AAAMAKBEAGEQEICGBEKWYCBM@IIEGGC@ASAA@AEC@BHC@DJCFBJOFEHEBCNDNKJ@BBFFBL@DFHDBFFF@B@BECAFG@@EAA@RAHBBF@@FEFBBHFBD@BCBADAH@DJRLF@BYREFGCGGCAK@ABCBEQA@CFIFAHGBBHFFTDFFBJFHKPDHMDSEG@MFEAMOEACBI@EBIJA@CAAEA@KNA@OEI@IDCC@CE@A@@GCB@ADGAEC@AFIB]@ACCAEF@BS@BLGNAHFHFL@FELCBECCECIGKA@G@ADAHBFFFDJDDN@ABIFBZJJDD@HQJ@JAFCBUNGLEBK@AD@FJRADSFEP@VADCBICMBA@AJILERADDHNTFNJBBDDP@HADC@KCC@CB@BJDDDBFADOFBLEF@JJH@DGB@BJLJFJPLNLLBBCD@DFFJDZNBR@DABBJjpBLLFBHLFADADFFHPEF[LCBABJLRL@DADEFFFCFDHPNJEVLJMD@HFIJ@DBDFBFAHODBDH@NDBHBBAFKBCHBFBBHAP@DDBFCDBCN@FDBD@BABIJCJGFAJDBPDFdD^EDCLIGEAA@AFCNATBBIJEDDB@@GJCF@FHL@TPDA@MK_BCHAF@FFJNNBJHDHAHAF@DDBDANMJCNAJDXJVNNTABGB@BPJFHFAX@BCFGRKH@FABCNCD@PHP@DDHA@EGKBAD@FFFBJJLHDFDDDHDAHFRDDBJBBLNNJPJDH@HH@HFDLDDABC@CCAE@CC@G@CFEDOAECGCSBMPHBHDDND"]],"encodeOffsets":[[[122386,25872]],[[122237,25718]],[[121933,25635]],[[122329,25582]],[[122027,26000]],[[122033,25986]],[[122061,25979]],[[122434,25772]],[[122266,25758]],[[122516,25833]],[[122474,25841]],[[122480,25849]],[[122461,25848]],[[122461,25821]],[[122449,25855]],[[122450,25871]],[[122423,25772]],[[122463,25792]],[[122389,25759]],[[122350,25860]],[[122207,25920]],[[122233,25935]],[[122120,25960]],[[122130,25957]],[[122231,25718]],[[122143,25765]],[[121875,25778]],[[121906,25704]],[[122339,25802]],[[121825,26342]]]},"properties":{"cp":[119.007558,25.431011],"name":"莆田市","childNum":30}},{"id":"350400","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@A@CFUPGBQAQKC@EDCbADKF@FARCHIFEBIAEIK]IEK@O@GHIXEDCAOOEAGFGNI@IAIIGIAGLSBECEECIAIDMAEECIKCGEGEOLIJIHM@EEEKKGQCOBGF@JFF@HCBODOJIBMMGCO@QBKEQEEGE@IDOKKCQBGAAG@GHCHCBCBEAEICKGKMIGE@EDEHGHC@MCG@EFEHABC@CAAGWCAA@EFCBKJAFEBCLGDIIMCD@HADGIEACCCMIE@IEOAC@CHC@CCIBOEGAMOEE@GBGFC@AAAEAOAAEDE@@A@GBCJC@IDGFEDE@GBCNBFA@AGGBCHEDIBALRD@FA@IMgAMEGECWAKGC@M@WCEC@ABCACK@EDG@ACHE@AKCEECCCM@CBAH@NHJ@BECEHQFDFALD@AFCAGH@HG@CCCJADEF@AEDEFAAAC@BCB@BCB@FNDEPAPHTDJNLCLBDABADMBOAGBECOCICCGCAEDKGEAA@MACOGOMCEQGACMSYGCE@KAGBAD@DAACCACBKLULK@IEICI@EKIACKGCQEEBCAEEAAYAA@@ECAYBSGC@MBUMIAEBIFUdMJEFK@SOCAIDO@CCBKBQNMDEBGACC@GBKFMNIHINC@EEEBCNEFI@SEMDEDADFB@DABQAIBCCABICC@KFCFQGCEGR@XBHFJDPFPBBH@HHRKLKHAD@JPRPJNJlAJG@CEMBcGKLK\\U\\YVMHGNGTKTQJOBECG@GC_UOIKAI@GBGJKVBFLJAHOPIPCBKBI@ODOHEFCPKTEFE@GGG@QGKIKSGCA@@HIH@NGNBFPLBHABQGGBCNEBG@GEOCO@CC@CHEFDHCFC@CAECCKEOISoKgIG{M]@EHBJTdDJANCN@TEjEHACBSAGAASNCVGPBBJFDDATEDGf]FM@KICQBMAQYEWI]OQCM@MAWKKMASECAKMOMYLGZFPBJALQBIEMg[SQaQCMAQGKEIMIIWMECC@IQU\\AACCAKCCEIEIFQ\\EBGAACEEEAGBBRDN@TSbYXGLCXOPwNQAAAGAKAK@CPKP@BDBHCF@BLG@AD@FABG@@HE@KCCBEB@DTNBZ@FOZCBA@A@DOCAQRADBDPFFHLB@FMV@D@FJFBD@DADKLBLBF@HENQRW`KhC^GPOHOBWCUCQGKGeGGJSFKJQBOAWIWYO[CCOGGKM_IGODMEOGcGUNMPg\\INF\\FPJRLNAFIDSA[OQGOLGjA`CJIJOHQFYTMDUBMVEDKAOPU@GBCFAZDLCJGF@VFRDFAFBDFFEBK@ABDHSNKDGkIKGCKAGDGFKDGBMOIEQHgJ]NG@IEMM[Q[WK@GFGLCPB`CLIJOHwFWFOD]PIHFLCPDBLDTJDFBRDDFBTNPFTPJLLBDF^RLLFFBPANCHADIH@JDHGJ@FDJAF@DEBEHBDABB@IFO@CGC@CCC@EA@CB@AAEACBWKQAGBCCADBDHFGHCAGOE@C@ADCFUDIH@DDFHFAFBFBLFD@BE@AFDDABEACD@DB@JB@BGFBF@@EBAACCF@@AAAG@IFHDD@FNCNGNCNVN@D@FAFEF@BDJHHAJDFFDbHDDDL@JSN^DBBPLBBD\\JHFB@@DDJFFJFRLHPFN@DFPJL@HDBDCFGDFL@PBJFBLAHHBJ@LFNHD^CBE@IVGJBFDDE@GHO@MIYDA^LL@FA@CDAFANJNBFBBJNNDTMXBHALBDDBAJBHHLFFFFNDFDDFBJ@JBHFFFDBDAJDL@DMAUBSCMNCAIB@BHNEBMDCFNJFJ@FCDK@ADED@HQDBJ@JCFMFONIFQHIFGDAFADDNDDH@NLLjFrFN@PHNEP_BIRIFGJadGLGdFZNNRHNJBHXVLRFNANINKVGZBbHhRXHFPHllNFJLh~X^``VZh`NFRLTHLDLBPATBXGHEPEPbRLRFvLRFJARAhMTD^TJL\\LTB^@RCRYHFJRDNX`RR„fXJPBZFZPLDDDB@DFPLF@B@BGAGJGPCNCHDFJDLDBD@JCNINMHAHBJFPDPNFDN@DFD@HKPGFEFCDEFSHIHORWJEN@JGRCHCDCVGDQDCF@JDDBFJFPBBPFNNJ@BB@RDJBFAPGNDJLHBDAVCFG@EAEEG@@FDTBFFDFBJ@`SNEHAFAL@FAJMPGNCFEBCNHL@JBPAHCLBFEBIGK@KCEBK@ADADBRCFC@CBGNOLANNPBLJHBF@DA@CEGQQEE@CBCHCJLFBHCDCDUBEGK@ALEBACMFMHCF@NNZHDHFFDDHC@CGQ@AdAFBBFLDBAAGLCFGFCLDDABCACBERBHEBAEGAEOEAG@KAEASAAEC_EGCCECIAQBE@IBCJILCRLFBJ@PGD@D@HNFBN@HKFCF@LHHADCF[LaJC@CBAHAHCX[B@HBDAHMLI@CAIFGBGBEPKNQFMJK\\S@CGE@QHIBGIKIEIICI@KCIEGGOKEOCCAIMAESDEAEECKKSAAI@ACAEDEFCP@HC@C@CKIBCJCLAJIDFNENAJC@IHGICCBA@@ABCHADG^ATBDA@EAEMGBGHOD@TFDLDBZEFPHJNHNDH@HDFDJAFEB@BBAHDDDADAFKD@TFF@TKHNLHFBDAP@XJPAFED@FHDALERFJLTHHADABED@IEDEEEAEAACAACVK@BCF@BF@BABCAICEECAKLEBGRCFCACGIO@GEGBCGHEDYNCDCBKGQ@AFANBBCDGBGEIJSDDHJXJHD@@@EBGB@FFDBDABKBAXARJNTB@B@LEHMLFPCLFB@NIJJBD@FGJBDD@FCJBF@DAJIHAN@BA@AKIU[@KCC@EXQDC@UEI@ED@DED@NFF@DEXHF@D@JEDEAEAACDA@GMC@@AJQIAECAC@IHUDCDAFJDFFBFBFANGAKBEPMCCEC@ICA@CBELEBQDCB@HDD@HEL@@EHKBGEI@CBCFC@IJ@JDHGFALB@GFEEG@GJ@FCR@D@DE@OBAB@d\\F@FCB@DDH@BB@NFDHBHCFBLG@CFCHBHFJBHDDFHBHFAN@JNFF@DEFCRAJ@EM@A`CNL@JEDAFBDHLHJX@DALKDAVJBF@FGJ@DTLDADKZATPD@@@@CESICECCE@KDGFCL@FDL@@FFHB@BCFSDCDANDBEB@NJDHVIFKDCLEJ@V@FFPBf@DCHADBBJBDDBH@@CCEHOAICCCCC@OPCDE@IGGI@OBKFEFIDCBGFEPCFCDQDCZNFFJDBFTHRNHDFADGDALANMBGPWFBR@DHDBNBNAPKBEEK@CHEDAPFdABCGIDGFCBEFGHCFDD@JGBEDQJBLCHBBADO@GBGJIDEZ@DCLQRWAEEECKACGDC@MIKBMHMJgBCBEGOKFELSJGEKSL]CAEECE@@AAABAACDEACCGCIJSCCCAOHC@@KACDE@KEKB_HMHEH@THDA@ECCBEEKEGBE@KBMFEDAF]BEHAHDDAEMIGAGPMQEWTI@mGoA[DAABGBGJOAYIIAEFSG@@A@KHEDWAGISFC@EFECECEACLKCEBGGKCSBEH@BECIMQAEBKGGFADILO@AGAC@BD@BIPO@KDMBOJGAIGACBED@BEBGDEAYEGO@IGABJ|ADEDEBKP[VGDKMU[DIACM@CE"],"encodeOffsets":[[121252,26511]]},"properties":{"cp":[117.435001,26.265444],"name":"三明市","childNum":1}},{"id":"350500","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@D@ACC@BD"],["@@DAJBAEEAG@AFDB"],["@@CB@F@DDBBDH@BAAGEGC@"],["@@BAAAEBBBD@"],["@@HBDAACG@A@@D"],["@@@AABB@"],["@@DDDACCC@@B"],["@@@A@B"],["@@DA@AEAADDB"],["@@B@@AA@@B"],["@@F@B@GA@B@@"],["@@MHIBEF@BJFBDBFCJ@FFFN@DZDJHDR@BBBDFBDBDAPKVIAKCG@MEKAAI@ABADE@IGBECGICGDC@EAIMEA"],["@@BAAAE@@BFB"],["@@H@AEBGHAFBD@AEICGFE@BFEHDD"],["@@B@DCJ@CCGACDC@@DDB"],["@@ACA@@BDB"],["@@BA@AC@@BBB"],["@@GAADLJH@@EDCAAK@"],["@@BBB@ACAB"],["@@@BDAAAAB"],["@@BBBACA@B"],["@@FB@CC@AB"],["@@DBDACAC@@B"],["@@@BBA@AAB"],["@@BBBAAAAB"],["@@BB@AAA@B"],["@@BBFBACCCAB@B"],["@@DDFB@CAAEAAB"],["@@DBAAA@"],["@@@@BAAA@D"],["@@BDBAACAB"],["@@BBB@ACAB"],["@@D@@@AAAB"],["@@BBBAAAAB"],["@@BB@AAA@B"],["@@D@@AA@AB"],["@@@BB@BCC@@B"],["@@B@BA@@CB"],["@@DBBA@CC@AD"],["@@BA@AGABFD@"],["@@@AABB@"],["@@@AA@@BB@"],["@@HC@AC@CD@B"],["@@@BBBBC@ECB@D"],["@@AACAAEEAAIC@AJBDDBBADJBFFBD@@AAABAAC"],["@@@AA@BB"],["@@@A@ACB@BD@"],["@@ABBBF@@ABDD@AGIB"],["@@B@BGAECCAD@HDF"],["@@@B@BD@DA@C@@GB"],["@@@AC@BDBA"],["@@DB@CAAAD"],["@@B@BAC@@B"],["@@EDBBFA@CA@"],["@@@FAB@DCDBDBBBAF@BA@EBCHA@AGGGBAB"],["@@@BB@AA"],["@@A@@BBA"],["@@ACCAEB@BNF@AAA"],["@@BAAAE@ABHB"],["@@AB@BD@DA@CAACD"],["@@BAAACB@BD@"],["@@BAAAC@BDB@"],["@@AB@BBABBBAAAA@"],["@@ADDAAA"],["@@@BB@@AA@"],["@@DBB@AAC@"],["@@D@AAAB"],["@@DBB@@AAACB"],["@@DAA@AB"],["@@B@BACB"],["@@BBBACA@B"],["@@@BAA@BD@@AA@"],["@@BBBAC@"],["@@D@AAAB"],["@@@DF@@CCAAB"],["@@@DDACA"],["@@@@D@AAAB"],["@@BAAB"],["@@FDD@@AECCB"],["@@BBD@BAG@"],["@@BNCHBDD@BEFCB@@DHBH@DCDBBACCFGBKFEDAZAFA@AAI@EBCFABCBOHIDAHDHA@CIMAG@MFMDEH@FC@E@GCEEAC@@BABAACEEABEBAFIGGC@CBCAAABG@AEEQGC@MGUACFBDHDJ@BDADIHSBKDKHKFY@gCWKOICE[sGGGAG@MBWPOBAHGF@FWNAD@DDDN@DB@DEHBDHBd@@BC`I\\CHCDKFABAJDLNJTFBHFBLEDCl]NEdIJCNBPLDJAJMNBBJAF@BFLFBFAFEB@BBB@FCN@FRBRH"],["@@D@A@A@"],["@@@DD@@CC@"],["@@AB@BH@@CAACB"],["@@BBBAA@A@"],["@@@DB@@CA@"],["@@@BBAA@"],["@@BBBAAAAB"],["@@AAABDB@A"],["@@DDJARBBA@CEABCFCNCTFJ@FEDMFAFFD@JMJGNMLEHAD@BDAHCFMNARALDDP@JCDBTPL@FENIVcJEFAJBVNNAD@THZADB@FB@ZBBBFFDBFARFHDDLJBFLJ@JDJFL@VKLKDADBBDIDBH@LDFZHNTBDRHDFPNPHBD@NBBHFCLBFHDDDDJDPAFBHAPCNABCBKAKDIMSCOGOBCFEMA@ADA@ADD@BBEBCFBFE@CFIBDD@DGHG@BHED@BKCEBECGRDFAFI@MGG@AB@DDNDDFFLD@BGFBDH@FCL@BDAD@BFDXDN@D@LHXBFDFHBNNh@JEBC@KQABCJGFADHH@BEBMAAD@HCFEFCH@JIDAD@H@BF@FCBBBPBFBBD@HEHAF@PFBNFHAPDJ@DGD@DBDFP@JJFDNDDFBHJBC@GDCJNCJKHADEFIBALED@FBBXDBHDBD@BAFGFEH@NDD@HGFGFCF@JHLNLHJDBFAFADGDGD@HBHHBRALDPLJCF@FHRFLFRAP@HDNNJAPIPCDA@GEE@IHEPARDLHFLFFN@JGJIPKHFHFLDDJFFNBJCJBFDDFAFKTBHHJJJJBJ@HMHEFBPPDBFCJWHGP@L@JFL^FJJBFAJEDGBQ@ELEBCDaFCD@RLRBHAVODEB@DKIA@GLEBAJYFI@CGEE@KMGCKFC@CK@MCOUW@EFENDLQHETGFIH_@IDGJGDGBQAA@KHURQJEHALFDAB@HINIXEBIVOBKLIJID@HEHKLIDGBC^@HDDCDE@CQKIKBADA\\KFEGOEEBCBCKEAGKEAKioAIBA@CAQYMICEE@CDCAAKKKMIOIEEECGHA@CIG@E@CFEAKPEBCAECCIC@ADAD@LDD@BC@GCOACIAEMMSCGBCFQJKBIB@NAJDDABC@UFOTEBCIQ@EBCL@FAHKVMDABE@IRI@GCCIIAYJEBAM@CCCIGI@ABGDCF@B@HLDJDFFDDADGBIEKEGBGHMAKT@@AFEDBBD^@JABED@BFCH@BDA@HB@F@@DDDJCJ@PFB@LMB@BFDBB@JIFAJ@DAFBNPFBNEH@TFNCCGLOEGAIEEEAMAEEAGHABGJEFGBBDRDABAL@DBHHHDFETMFEKEGMAGDKDA@AACGEAAFE@EE@AABG@QBB@FH@BEFD@A@AEEAEGCCEK@EAAE@ALICMDMFAFGPEAIDECID@AGD@BFB@TB@BHDFHJJN@DAXZFLHAJDRFHFFBLANBBB@BCRBFHJhPAGFAHDLAJDTAFBJBHDAHF@PA@ECGBCD@HJFDRBHHBHALJDBDPADAZBNCLFDCJADKRCJIRCBGEE@EDEDAHGF@bFHADOBCVG@mBKEAKIGCOKYAAE@MBSBIFANBFGRCBCAEMGYIEEICSIG@KDUAEE_GM@qST]FGJGJ@TBJALEHMAYHKVKJAF@JFHBHAPIHAL@HBLHJ\\BFDBP@DBLJRJH@JIJ@BC@CIMIKIE@QEEAMHG@CCAI@@CDCBCGAKAEFG@EKAGBMLUNID@HDDADE@OD@PJFBDCL@JAACBC[UII_C_KCD@BFBABGBƒ\\G@GAIE]cAEBIDGLADADQBCDARBFCJKDCHAJBHDPDP@NGBABMHIBCCEWGaEKCA@DDABA@CCC@ABADCBGAE@KGIASF]FMFGJIB]FWAGCEEEAMKS@AKCCRCDCAACAAGEEIAGLKJIHMDMAIGCCWO‰UGI@WCGCCCAGBEFATAHCBYDYDKHAJHV@DGDC@CAMSIEUIkGECCU@GJgFEJAHCFIHCHCJ@FBRJXIRBHF@DCJ@BHNJDV@DEBCGSBODKDGJEHANANBBAFBHENBJABAHBH@@CEE@CDCEIDE@CCCGYEEIAGEAE@C@EAAIABEGGGCABKJGCCGDANBBCQOC@@CEABKB@FBBAEGAEA@KCAGCACBADAAAADABCEG@ECAK@EGGACEGEUEM@IDGFIPCJMEKGCGE_DiDIFIHCJ@FLBHDBLBBA@CF@@FBBDABCBmIQ@MGUCGIGQAMGCGBMBIAAG@EBIAKI@COGKOA@CBC@GSCGIEMEYCUMCAIDCDE@KAEBADRRC`AF]NEFALDHHFJBDBBF@FCFytSPMDƒN_BeAMGYUEC_IƒcMIEEACCTI@ABALAFKFKHDR@HADA@IMEACACJ@DFFDDFPJBFFDRGXPNB`[RADBH@FWNGHCDBF^jBHINCDMBCBEVCD@FFFTBDCD@DDFTEF@FDFDBDADAB@@JCHCDEACCAEC@QNADHJBFGFDHGBGFKFGNEDGXEDQDIFG@SCGGEAE@CDCBEACHE@GACKEAG@EBCBCJKPAFFFBDAJSHGHKDSLEH@FFNLBBBQVMAIDCCC@CBCFCBIBM@IC@EKAM@KFEASKKGKSE@ABqWOSEBCN@TAFCBG@GMECGBEFGNKLCHBRCFEBKAWHEAAOCCGBYNGACE@EHETCPIDGAECAQDK@KM@CBCPMAAKCYKE@GGCBCHGFGRGJSFWIABELIHCDG@G@ECACAKI@GHIBIJAFBHCFIJIDAABIAAEIGEAE@ICCCBKLMAGEEAKDULG@IEGGHOIIDC@CIECGCAIDKB@DCD@LEFE@AACICECAQIE@IJBF@BCRADC@ICEDIDAHEBOBKFE@OCOIGGEMCCECYGMEGGEAMBIJEBOCINKAC@IJGFGBOAENIHAFBD@FCJ@J@FBBRJFJHHBVCDW@ODGF@JEN@LJJJPJHfNHDFFXL@DCJBJ@FFBR@JDHALIHIF@JDDD@HJNJBPAF@FXDFHBZPFF@JAFYLLPADGN@VEJCDE@KGGKC@QVGFO@SNGHCNA\\BXABMJUHa@ADCJCBIGKTAFDH@LMFK@IBIFCHMDI@EDON@BDDADEDO@ECEBEF@FDZEJPLFFD@F@@FHFBHFBFAPGF@B@DA@EB@LCB@DDJAF@FFJVDLCNGJKJOHDf@HELCD@DLJT@HBTPRFVLLJFRHNJJ\\LFD@FIFBFNDLR@JCPDRON@HPRFJBHHJOZ@JDL@HDFDDLDDFBNFNHHLBFDGJELALFPBN"]],"encodeOffsets":[[[121802,25820]],[[121740,25685]],[[121899,25675]],[[121684,25454]],[[121623,25425]],[[121623,25333]],[[121555,25259]],[[121539,25232]],[[121508,25224]],[[121270,25180]],[[121098,25050]],[[121068,24987]],[[121114,25038]],[[121002,24979]],[[120996,24966]],[[121182,24971]],[[121184,24974]],[[121622,25426]],[[121505,25152]],[[121225,25095]],[[121247,25105]],[[121281,25132]],[[121310,25121]],[[121294,25099]],[[121308,25078]],[[121313,25080]],[[121224,25052]],[[121217,25047]],[[121312,25017]],[[121314,25021]],[[121048,25070]],[[121078,25061]],[[121087,25044]],[[121071,25039]],[[121068,25037]],[[121054,25036]],[[121052,25033]],[[121055,25030]],[[121034,25014]],[[121843,25475]],[[121818,25469]],[[121820,25470]],[[121739,25478]],[[121837,25804]],[[121861,25787]],[[121838,25757]],[[121820,25703]],[[121800,25650]],[[121798,25647]],[[121880,25681]],[[121897,25672]],[[121871,25658]],[[121870,25623]],[[121876,25629]],[[121885,25631]],[[121885,25580]],[[121891,25561]],[[121897,25564]],[[121836,25535]],[[121815,25501]],[[121685,25431]],[[121692,25439]],[[121642,25448]],[[121650,25451]],[[121624,25406]],[[121606,25376]],[[121609,25377]],[[121549,25420]],[[121535,25397]],[[121552,25256]],[[121505,25148]],[[121483,25130]],[[121401,25127]],[[121359,25192]],[[121301,25152]],[[121289,25160]],[[121259,25116]],[[121278,25108]],[[121282,25109]],[[121304,24997]],[[121255,25103]],[[121040,25021]],[[121071,24986]],[[121034,24979]],[[121012,24979]],[[121005,24963]],[[120979,24957]],[[120982,24961]],[[120987,24961]],[[120544,26125]]]},"properties":{"cp":[118.289421,25.108853],"name":"泉州市","childNum":90}},{"id":"350600","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@@BBDH@ACGA"],["@@@DD@DA@CAAC@AD"],["@@@@B@BAAAAD"],["@@BBBAAAAB"],["@@AABB@@"],["@@ADBBHADGA@EDC@"],["@@@DBA@AA@"],["@@@DDABDD@ACCCCB@@"],["@@ABD@AA"],["@@CB@DD@DA@ECB"],["@@A@CDBBDE"],["@@B@BAA@AB"],["@@@BDACA@B"],["@@AFB@BCAA@@"],["@@PHDAACECC@EAAB@B"],["@@AACBHFAC@A"],["@@BAAABAACEBCBC@ADBBFAHB"],["@@BBB@AEA@@D"],["@@CDAHFABBF@BCFBFABAB@DAAEBAA@IFCGIAA@@FAB"],["@@AB@BB@DBHCCGEDAB"],["@@FCFDBIFC@EGBCFEDC@@HB@"],["@@D@@AA@AB"],["@@@DAF@LBDB@BADG@IDAACDA@AACCACDCF"],["@@BBD@EC@@@B"],["@@BACA@DB@"],["@@B@DA@E@AGF@DB@"],["@@RKNGXaFAH@TDDAJEESBECIBEBA@EAECAE@HMBKBWAMCKGIBKEAICCGCSEKBQJgDENEBAAKDML[DM@ECEKCBI@CCGCMCCICKKMEIGSeCAQBOCMDAACABK@E@ICIIEBCNGNKNGFCFG@GEECQBEHGACAI@KHCP@DALGFGDOBCFAFBDADGPGBEF@H_AABIAGGGBADA@@GUDKLSPMFCRAFCLQZIpDXAVAˆODC@EGiBQCKEGGEAEBCJEJDTBVAJAPMDEBUFABC@]B@XGJGDICQ@GTSHKBOAMCIEEKEGAcBA@AaAEECGCQAEKCIGMSGEGEcKKAM@EI_a@mIKIG_QWQa[UWOUAEC[FaBSCMQ]EOIIUKSCs@ICWcmeeeIUS}IMeWMA…BqDYAWIMK[uM‹BGDGJKDGAMCGgeWe]‰IOMGK@I@UJULqHMCcSc@CAO[GU@IBEHAFADCFO@QCGMIKAiAICGIEI@aBKPOBUACSUWGM@OBIAWKyWM@G@SFI@OA_G_CM@QBGHGJEXiIßGAÀBJCHIFEAIBICGHK@GDKJMRIEADC@CAG@OIAAERKVKBUAIHIAABEJKLEPEFE@GCQFEDCJ@NBFEF@DBJCFAFDFAJBF@DCJ@XCJILE^EHENSPIJBFCL@BRPEPCVEJAHABEDAHABYHIFIBICEIQ@OFEFEJBBDDDBZACFBFBJFD@BABIBAB@DDFCH]LADDFBD@HAFEDCHBDHBFAJBLHFHBNFFBNCJHNORCF@FBJAFBDBNLLBFIJMFGAKGKHAD@DDN@FKJGHGBCF@DBBLBDBBFBJALDBBFGBMEG@ABCNIHADBHC^BLCJAJBFHLFZBHJJDFJBDBHNHFJLFDR@DBBHHHRHDDDJJJBDAFGJWLGJCBKAGJCJOJ@HU@EAQFANDJF@@@BRAFELDNAVFF@F@FA@C@@B@DDF@DGFIBQEC@GFCnBJLNCFMHADAXYT@FBLRZ@DELL@NATDFBNPJpFTBRIbEPQXEPM^GVC^DJRLN[D@BBHP@JGN`Xv@NA`GTHVXJRBX@TDP@PS\\BXHDdELNFRBT@BMVML@DFJBJDD@PCDUB@LCHMLL~@`AZBLHL^TJ@HHFJA\\BNFJNDJGBGDSCY@IBIFENCTJBDJBLBzIN@NLNbHLXRFHB^BT@NBRHJVLDJF@LHFL@DGB@NKBCDGT@HCJBHZGR@JANUDCJAFBFJPTAPHNBFDDF@BPCFUB@JDFlNTJNLJPNFLGBEMO@EDANHL@LOHAHDBAD@HF\\HLHPCLENCNBFDNNLFTGP@fCDBFCHELMNMHC^ARB^AHBJFFRIžBNJJFPHJFNBbBLFhOfkXEF@HJNBd@ZDDNCDB@LDFPDVAHDLHHHBZFFBBLMLED@BFIX@FBDF@N@FICY@EFEFAFDP@FCBCCC@APMFCJ@NCDGJEJAL@NE@KCGBELSJHDADIBCb@VGNIBAAWB[DMHGTMP@HERUD@HLLHF@DCFI@UHMBCKOZKBE@IEEYOGACEEWE@OBIAIM@GCCICE@GJKJGBICQ@EA@EAIDI@CWKEEGCeMIGIOII@KFM@IHEPCX@DCAUGGEIQIAA@E@IDI@EACBEJGFMPBHAHEJID@LBJMPDFAJINAFBHHNFZHFDDDFNHHPJPDF@LEPAFABGJCFCJDD@BCDQ@AAEJIF@RJDBDFDJBBF@FE@KDC@CLAJCDBDHJF@DCDJJGPHHJFH@VKLCFBHFNBLKDADD@JBFHFFJBBAJBBJCJIDEAGBEJIJAHGJB"],["@@JE@EA@AAA@BHED@B@@"],["@@DDFBBBB@@EECC@CCABBD"],["@@BDD@@CAAC@@B"],["@@BDB@DCEAAB"],["@@C@@FCFBBCFDB@BAFA@AF@DBBD@LGBEDAACEA@CBCB@@ADCCCE@AA"]],"encodeOffsets":[[[120963,24945]],[[120535,24416]],[[120559,24424]],[[120918,24768]],[[120921,24767]],[[120968,24911]],[[120975,24931]],[[120916,24946]],[[120923,24946]],[[120861,24766]],[[120641,24511]],[[120694,24484]],[[120562,24394]],[[120570,24387]],[[120585,24385]],[[120560,24355]],[[120557,24362]],[[120543,24340]],[[120537,24344]],[[120521,24355]],[[120509,24356]],[[120498,24353]],[[120494,24362]],[[120517,24095]],[[120494,24116]],[[120293,24163]],[[120743,25468]],[[120278,24145]],[[120239,24127]],[[120243,24135]],[[121075,24739]],[[120987,24903]]]},"properties":{"cp":[117.561801,24.310897],"name":"漳州市","childNum":32}},{"id":"350700","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@NCDCHMHE@GCIEGCMACSCSUECKAGEU_@KBAR@HDPHJ@VGJGDIBMEYEMDOAIDCSIGKCAC@QBKAEAEECQKEKDMGAACICAEGCGMGGKI@@A@]BGJCPODIAEIOES@SFGHKCCBGCYBELEbeBKH@N@LCBAZEhQBGECAC@AdC@CEGJK@C@OJKFCFAKKBKNEDI@GEEAEAMCCCCROBGBCCEFQFGLGBE@OFKBECAE@ICECFKCENEDEJ@BABOJKJSL]DAHAFCJMJKJBF@AIHI@CAEG@UBM@CAAGJKBEAECEGE@EBCHI@EBELKPIHMJKBIEKDCBAAMFCJ@DABCAIGEAMCIBGGGBE@M@KFEHCCEQCGECMIQMIYEKUGAEK@GBAJEFBNDBBFCBKAA@CBAFA@CCCDCLDDGDG@KCC@CBEJBHEJSAIFCFAX@DBJ@NBD@FADGVEJKFDJVAFADCBNJH@PFNAHDBHAFDF@DEFEDCD@FPJHGHEN@XDHAFGLEPSFCD@DFVGBKRKDBLJF@FAHKHAD@HDDFFDJHNFLJPCHCFGFSACO@ICBCHEDC@CCKAIAG@ANIF@HDD@LAFE@GDAHDDBJEFBFDFEB@J@JFD@JENEFGJBJADDFDJAPGZDFEBBJD@RFDBABE@I@EFDHDHAFAAEAMDOFMJIHGBOMSKEM@CC@MDM@EICEA@GAEECAEDG@KBGUBECAIAAA@KFCAGEM]DE@EAGEA@WBKDKACG@C@BCHCBGFAF@D@LSTONHH@BABEDBLIDDFA@AACAELEDILGBCEKEGAIC@ABAJIBCCE@ACCAAD@HCFEBEEABGHBNAD@HGDGAKFI@GHE@C@CE@GG_UGIAKFCEDCCE@K@K@M@GEI@C@AF@LBHADEDIAKIaAGBCJEJ@RGFCBEEEAGGAIICBEHMFCCEAE@GCOCECAOFGACCCEBECUGSDKAAABSBCJIFYACaE@LEDAB@FCDE@C@AD@JADMDKJAJDH@HCDWBGDABEA@BC@ECC@ADAAACG@AFBHA@IIA@CHIFE@AA@GIBEAYBECIIIBGHEGE@CBAFGBCJNRDLOJCFDTGhCHEDKAE@SJQ@IBMDGHE@ECGG@CFC@AAG@AD@LFAIMY@KFAJ@JBFDAM@MT@@KDEACCAIQGCSDGFAHC@I@AAAEAKGGCEQEGEIWAMQMGKIKCICOCKSQCAEGKFEBECIIAKBGFEAKGCCCDG@CWKIGQEWCQMEGBMAKGGKCU@QFQAMBYNGAOMKEIAODIHEH@LKHSAEEMYFIf]J]DEHI@CEAAK@IAGMKHSCCGKOEIBIEIBGDYCEEBEACC@G@UAAAIWDENIFGFGBI@GGiEEI@CACEDE@ECEAOGIKUAI@[CGKG@IES@MC@GDC@ECEDC@KOCKDEKIEIACDCJGVAPGDADM@EKMBKCQEME@CGBG@EEMHQ@GEO@KCIBOCI@ECCDGFILEJAHADAFBLHLAD@FE@EMOFM@IYmHW@IEIGMEGE@C@AJC@GGWIKEECEGCEAEBIAEIGBAJCFEDGAIAEIEEKGAGG@K@AAABQDA@GVGDC@OAUBAJADDBFDDPAFBDHAFFBDC@CEM@GDCJC@KCGL@FDNPDBD@HHFBJALMFCRCTMLCLG@CCEFOSMCEFEFIBCAGFKHGBEBOCOFGAGNeAG@EAAE@MTKRCDGBOAOPAH@HCRA@KAGDIACRAFIHC@ECIFELILHJADcBOECBGF@DFLAFOLMBMACACGQ@EAOXAHMNKBCBCHCBICQMSGAEICEEYMCDCREDODEFAHCDEJEFAL@PHJJHF@DCPOD@DDDDBJGPDF@DG@CAACAICAGBCDe@OAEEU@I@KFCDELUJCGMIA@AFMCCBCDETADA@EG@EK@ECK@EDCH@LDFFDJDFT@D@@C@SOYBCLCBSK@CHI@EAEUICBKLCBW@GIGKACBEFC@IMK_D@BFNI@QBEDCFE@ME@IBMGEGACEGCIAGEGAED@DKHEAGDGAEC@MAAG@CCA@EDE@c[A@AB@PCFC@Q@EDI@@HFHEF@HKAEBGHICI@@JEDAD@DFJAHGL@FK@GFC@GCA@CDARKFAF@DDB@JFDDDONAFBLMHEBEAEACEEICBCDGV@JBDFDJBIR@BD@HNB@DCBBBFCFIFC@E@WGCFE@MEC@CFC@@FFJ@VCDWR@FDD@LV\\LJ@BABM@GBIJCBE@IAEDC@ACHI@EACIIMJA@KEODKEGNKFA@A@MSQIWBABALCBCAEEA@AH@F@@GCWIGICCITFJAHCHADMAEB@BHRALCDMDCZGFDHHAHFP@HJBDEDQDAHKFBLFDDFBJADABE@@ADE@AULBDDBBBBFFFCFJFC@AFCBGBSGIKQEKFCBEGC@EFOBWIO@CBEAKGGMSLE@SEC@ELCBCBCCBGAAA@EFIBECGCG@MCMGGIEOYFCACKSEC@GPAHNHBF@FCBSA]BCHGBAD@BB@DAJDGH@JIDMBMFCEIJKBIDADLJ@D@DGDO@EDCFBFBDJ@BBLTDLFFFBTCBFJNDBPDLFHPFHDJ@LDJJJJFJLAHGJ@RHF@D[TILENMROLAFAHEHBJ@DKJGNCBGAA@W\\GDGBAB@DIDKbE\\CDGBKGE@EDGLM@EAGMC@C@OHI@EAQKKDIJAD@JAFBRDJDFHD`FFDBBBTBF@LBHPFBFFHABGFQAAFBDADCBKCEDEHKDBHABKCAEEAcB@BHR@DGDCCEECGYGMME@GDENDNABKF@BHLAFCVCDGDEAIKGDAD@DFFRRFH@DCBE@GAKIOAMMKBMPAH@DEDQDCACB@BALDF@LHLAJEFKAGDOBIAK@MGADEFMDOHINEBK@EBGBMF_TI@EAECAECS@EH@FFFBH@DEBUACKGCIHMBOAECI@QAAI@MMOEAAEOEICAICE@CDCRUHCDGDQDIHM@IFQXGPGJETCFEDEFOHGLC@CEM@ECOMOCIEGAGBMNMJIDC@CACKEIGCMDODEDCDBLCDE@OKCEA@EX@JADEHET@NDPFHRJDNTX`PDFDJR^HDHGXHDFDLJDFJVNFLNHBDCJLL@RDDHDHAFF@LFDCHDFFRCDG@GBCDGNM@IAQDBJJP@FCHU@]LGCA@IHGLAFFZCPFRADEJAHNF@RBF`NFHDDBJHVBFMRAdCBIAMJCDBNCD@DFNIHCD@FBJJLFBCFEBAJCHEDALB`APEHOFEJBJINCDCBICEMMGIOGECAGNE@MCIFG@GBMHGJAHFPJjEHAHCDIDAB@DHJ@BOLEJEFDDFDBFJEDBFNFJCTLPPHHJFBL@JDPCLILOPM@CAEBG`]DAF@JFLFABCBAF@JHBDDSdKJ@@HTLH@JJBHJFDJ@BCJAFGLDL@PGJBfQRFFFN@JDNA@@AF@HBPCH@HBJFHFBJANFNBN@LCFBJPFDFBNCFDBNFJJJLDBDGV@FDJD@LGV@JPHHBF@FQb@DD\\HfCHONO@GBGDADF^DHCD@DDBDABCFAJFN@HDLJ@LJJHLHBH@DAJGDCBIBICMBECE@GB@HCHGNBFBDD@JJLPXXLNCHDLJT@PHFH`\\BJDDDBFBHDHPHDFJNDD@DE@CDCJABEB@HALRl`FDDJDZVPNBDA@KFEVGN@FCHCDGFCBEGQDMHGHCHNLHNGCMDA@SDKAECG@GBCBANGFOHGFECYBGBCFA@AFCV@FEvQLITGHKHQNID@JHD@HCB@FDHJHBBAFKJGHOTMHIFCHAF@BBJLPJFVJPJFFFL@DDJTJLBDAFEDCJBNFJDLCJAJBFDBNDHFBJHFJDJPLFXFJFZPDFJNFBDADCDIDANJJBTHFBRCHFR@@HJJFJPFH@FFHHHBF@VGDADGFCH@ZHLHFHDPPPDALSHDH@DAF@NLRBD@FCFKFAB@DBDBN@HDNEFEBODCVCL@JBDB@FIXDPAF@JBLFFLHDNFAHEPAH@JHBDALCHIJARJF@FTL@DDDN@LDJFNGTALCLGL@HDB@FEF@LFJHDBFAVFXRLNTMFBVRPHN@HDPCdPFAJCLDVAF@BEDAXFFHBLALFJBHEJ@NFFRF@BADILADBJGLBBBHRFPLDDIP@HBPADCBSBKFUCMFIZKDQLIL@FLHdRB@JAFLFFBDAJBBRBJD@FHJNJD@DCRDJH@DHFNBBFBBJFJBRNJ@FDB@BIGQFEDQHBDA@EEEBAT@BCII@A@EHBDEHCHABAF@DCLFLCHFNKJEHNND@FDF@BGAABBB@FC@CHGD@@DHBLBDHBFHD@RSHAXB`HBB@L@F@DBBTGXFLCTBHCFILKBEEIBMJENFZAD@HHNBNZN@JFF@JIJCJ@LBNPPZHVLPHBHAHFH@HAFCLKDE@KCIAG@KZEBE@O\\[RG\\GHE^@"],"encodeOffsets":[[121647,28921]]},"properties":{"cp":[118.178459,27.335627],"name":"南平市","childNum":1}},{"id":"350800","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@JG^OPCXExEPGJIDKA_DOHKHEL@\\X\\RNNJFH@^MhIRGJFNPHALCHEHCLBHDJLHlLCTMCGBAL@FAEEACBECEEQ@UHEDICKBYDEHAV@POLBFCNUVANCZSREPGJIDIB_HiPKRH\\PTBJCBEKMIQEOE[JMh[NOVMdHPHNFPCJHN`HLPHDDP\\XZXJPBRALITEHIfHLHRHVDXDPAPGHOD]LgX_RQFM@GAEAKLKBC@CACIE@E@CNU@EKAEGOEACBCRQDBCPB@B@DAPY@EAYSM@CFADALDF@@GH@BA@EBCH@AKE@GDCA@ALODOL@LBHBBBRBxMPODWHKZWTa@SCMAQHAFBFFBDHBFAR[JEJFDFLDDBBD[BRV@JDDNFJXNJFJHLBRDNbRTRh\\FNAJKRIBOAYEKHNZNPBLFDBTLNXLNBN@RD^PXJZFBRANBJBHLJN@^EHeFCBSCCIEAAHODUTMBBBHATBDFGFi@SDMBMCIScAIFG^@|NJHLhTpPJLFDDBF@DEDGDECGF@DDDP@PDHFH@FADMHARHBAAGOKAEHM@MJG@GB@HDLTLJRHH@HHF@FELSDOFEPGPCJ@LADAJOPOBGKIAELUHIHAJ@LBPJ`VHDH@FDPARILSHSHMNGZUV[L[LKdHNAFFF@@A@QGaIMQOIOC@GBKLQLGGG@AAEOCOEIA_HQDFRHDELED@JDBAAMEOBKFKHIECKAGGEMAMCEKCEGAICK@EBGNUGIAGEIOQ@GPMCQDO@IKQMCAEJE@EEC[KIIGMEQKIUKQESOGAS@KI@CDCFK@GCePGLIHIDMCKIUEEE@IBCCA@KDA@@FCBA@E@OHEBEAAGGE@EE@C@EEOKS@AC@EJWAEC@KFKNAAEEAYGGKGGCUBOCCE@KCAMDCC@YAcIM@GFElWPeEgAKAaEMGIEOIIAMJEQIEGA]BQA]BGDMNKNGFEDCAeDO@SHKEMMECMAMDKFODKG[GGEC@ABGCGBKPK@MGCB@FNPAFKHMEIOMKSIkMCE@IVADEAOE@CCAEGMBOOSEIEAIBCDMVIBQ@YHAGDI@GHSDCLA@MHA@CEKKGE@CIUKGIAQ@MASA]EGWQGKMaMKM@yJKAIAACSIMDEFAJ@JDZE\\IHMCEIAMB[EIGGI@]SGKAKBY@_K}NKDG@KVADC@OCCAIEI@CNKNU@AASEQKMcFGCAWT[@OCO@SAWIQKMIISG_HMBu@_WHM@IGOAAC@M\\QKCID]HUN]FORWFOJaAQESIoMOEASCMBK@FK@CCEKXURCLE@EAKGCHCF@TIBABKVCFOHABO^@DHFCLBBTCBBLHDF@DMPIROPOT[SKEA@@D@BHH@B_NIHORINGN@FBLCBM@[XCH@JBDHFNHIXEHBFjjDHFHBHPJDDDDCRBJFDFBFFJDBBDREJCLQZIBIASDGAQQMKQS@@MHGJAFCBM@I@KEKDGAI@CCAEAEECUHICQBQ@UEEAAEC@QAEEG@CGAGA@CBKBEHGDEAE@SNGBGIAKIMSGIEAE@EAEQCAEIACAACSAKEOGG@KLIDIFGLHHAHFL@JBF@DHFBHCFGBAJIJCFCHAV@FDH@LCFSVEPGFE@GEQD[KI@IBGFCLANCHEDI@AHABQDEDAFDFHBIJ@BFHF@CH@DOPIFCFCJCNADC@KGE@I@EFBJMLAFFRAHHHFDJBFDJ@NHXJFF@DILI@ALMAEBEFAHDNIHDDHB@DAB_@ECC@@ABGACI@GFGCOSGEBE@GCM@MCKGGI@CACGC@@JIGSIGIOGIKGAYEY@MB[MK@IDOJ@DBHJNNNJD@H@DGDKBMCECCAMHABAXADADIDELCDODIPGXGBMEGKWUGEQSGAOAIF_DIDGCIBC@CCEDG@CABIGKA@GFBFALCFA@WBAEEAEPCDI@KDCFEHDHABABGEE@@BDBBDCBAPCFQNMPGFGBA@SQA@KAMHG@C@CNCDAH@FC@A@ICA@CFAEEAGD@BMFCCEBCCAFCBI@I@GBI@UHG@EAABAFADQPABGAKRCJGDG@EBEL@RDHVJDADGJCFODAF@JFZKH@FBBBAHMTedaFCDBHIFAFAF@NAHLJRCDFBJJBBFBDDBDAFHPDLGDDFJH@DFADKJAD@HO@@FFDAHHFEFEJIHMFKBW@EBAFBPFHOLCFAD@NDDLAJFDHAJCNEBCDALCDC@OEGBEHKAADAHAHBBPD@DCDGFCHJD@DAXBFC^PLHNFAHCDGDAPFBAHDVZRDPEBBHDLDDBDLHJFPJH@FJJBNEPALFLDBF@JCLIJ@DBFD@NBBDBF@HEDIB@HHJHLNDNHP@DEDIB@DHDBD@LEHCFQD@@BHLDDNOZ@HFJZ\\AFIX@HBBDDT@JHDD@HAD@HDLADIJ@HIRBPFLFJABMGGFAFDTCBAFJHFHFTHBVDLHCHBD@DAPBTDLBBDBPCLBDBBHHHDJ@DKLBJGJ@^CJIFGBED@FNTGFCNDBP@BDDLFFFBDAFGD@BDBTKHAHIJ@DJH@DCHBHH@@B@BQLHN@LFBBABIFBATBFDBFGHBLKD@D@HHNAF@PHDB@HAN@RJNFBDDCLBFHLJJBFDHP@FBBBJCDFH@JFJBH@B@BCEIBI@KHCLFBbDJFL@DEDCJCDGBAFCFCDGBCBDPCHUNMBCD@FEFGECD@RADAF@ZDFAJXNBDBFBBRJRDNAHN@FHNZNPATDJHVFD@DAJMFALDLBNCFBDBFPHFFBZ@LHF@H@NFDBDNFHJHHBHFHTBHDDT@LHLBbAFBDDBBEVEPIR@FBD@HHJJ@FBAJLLLZBB`D"],"encodeOffsets":[[119194,26658]]},"properties":{"cp":[116.72978,25.191603],"name":"龙岩市","childNum":1}},{"id":"350900","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@KBWJOLYXEJAFDRFHHHXLLDRARGPKJKFUDI\\KDEBEACEAUDC@]SIA"],["@@MFEFM^@RJXDHPLHDH@PKTGjEZHTJ\\HRCLGBOIOosKuC"],["@@I@IHIHEJAJPLLFFHFNTTHJFDHBJ@LGFE@I@MI_CAKBOEAIBGSMIC"],["@@E@IH@JBBJDBDBFDH@BEFBDNDFDJBRGDLDDFBF@DCDC@CASEICMGECAEDO@AAAEEES@"],["@@DMA@K@IBIHABNHFEL@"],["@@BBH@DDD@AGKCA@AF"],["@@NLFBPBDBDAACEIE@EAAAIBIEAB@D"],["@@BFF@DBB@BCHB@GDA@AKAE@BCH@@ACCC@@ADA@CEACAID@FFBABBDABCB@BFDAB"],["@@CFHB@FBABBDCD@D@BADBFEE@EEB@BBDACC@AIA@ACC@ACAC@ABBFBB@DCD@B"],["@@ADD@DEE@@B"],["@@ADDAAA"],["@@@FBBBGDEAAA@ABAF"],["@@JDBBD@B@BEAAC@M@@B"],["@@BBDCD@DDDACGE@EAA@AFBD"],["@@BBD@FEFFJAJABCCAGBKEC@AAA@AB@FCBAD"],["@@JBABBBN@RC@CACF@DFB@BCAA@AD@BCEACDEA@AC@@CCABECAIBEAADEAADG@EAOHEFBDDBHAPF"],["@@H@@AB@HBBACCEAKFBB"],["@@D@DEJADHDALBBBD@@CGAKIEC@AD@D@JBD@@E@AE@AIA@ADCACBEAAAE@AEG@@D@HJHGDBFAHBD"],["@@ILDHRJL@@AECBC@CDACEKGG@"],["@@FBJ@NBD@EEI@CCK@EA@DDD"],["@@HBHCD@DB@FNDDAACFEAAGCEAIBCAKAGF@BDD"],["@@C@CB@DG@IDEH@DF@BDB@BCD@BAFDDABEH@BCAEEE"],["@@JBDHHDB@DCB@BCH@@CFABA@EAAM@CCG@KGCA@F@FEAEBBFABBDDDB@@C@@"],["@@@DJJJABCDABEBAHDFCEC@ECAIDAF@@ICCDEAAF"],["@@HHJ@@CF@ACAAKCCAA@AB@B@D"],["@@DDL@@AHB@@CEKAGD"],["@@HBFD@HD@B@BGDCDCCCBAAAGBGAE@GB@DB@BD"],["@@BDFADBDFCLJBFFBA@EBCHEDGIACGWBED"],["@@AB@DPBHHD@BEAC@CEEEGIAAF@DAD"],["@@CPBBF@DABAEIFBFA@C@CECAGGGI@ABBDBBHP"],["@@FDD@DIQBDD"],["@@H@@CACC@BDC@@D"],["@@BBJ@HBF@FAT@JBFDBBTCDC@AKIE@@ABCACCC@GEE@ALGFI@AAAKBEBEJA@ECG@ABBFCNQACFKDAFGB@BFDADBD"],["@@IFIHBDADN@FAHEF@DCD@BA@A@AHDD@@EF@CEEACEEAEAC@AD@@DD@DGDE@"],["@@A@AFDLDFJDNC@CBCAC[K"],["@@CH@FBBLDHDLBL@dLDADERCNIBCACIGEGC@GDOBAEGEYEEEC@AFEBG@CDCDCJ"],["@@FJHBJKEECAEBEAAD@D"],["@@BBFBFARHB@EE@ADACEBCAEEBE@@BG@AFCBAD"],["@@A@BCCCIDGEJOJ@HGH@DCBKACDEHEAIBCFAP@HCDGJCAEDCDCJABM@INFFC@EIGKMPEDMDEH@HEN@D@DGCG@CBEHEH@JAHGAEKGILCBA@AEBU@ACE@CDAB@F@JCTCDDDLD@^KHKLCDB@HDBFA@ABANDLCDBFNKBIJPRFDFADEHEDCHDJCN@BAAAMG@CDANBBAAGDCFD@HBHHABCB@BF@FB@JEHBF@BHDDHBD@D@H@LIDBADDBNAHBHAPCBDCLG@ADDDCF@BJHABI@ABDDL@DBDF@DFHRJDDFH@DABOEADBHHDVDRFP@BB@JLFVEFABG@ONBFKPO@GAEDCP@TGN@BLDFL@JVDDHBFFDLLBNNJ@FDAVDDRHVDHAFABEFAJBFHBJCJEFCHBFFFPFdDF@BBFABCJ@LEBBF@VNH@LBD@LKFCHADDFABDJBDHPDRLDJD@XMDE@G@OGECE@EDELKNWDAH@HDJJJDFANGJ@DFBCHABBAHDJ@H@BFDHCBC@CGEBANEH@RHLIHKDGEMGI@ABECCACDGRGBE@AEK@ELIBERKJADAHKJUJI\\UDYJOLIFCZUAGCEICGDEHI@QKGIBEVMHG@AGOIG@CDEKEDAJ@BA@CGEJIBGEE@ARADGNGBCCEDIRIDE@GBAHBFAbeuoQMoUAI@MACOKY@kH_D]ACDCJCBE@[KCAIBSLC@GCAEBKLKBEAIEOHOPUBG@CGC@I@CAAEDAXAJCDGBEDUAKCIFIBGCICCaCGIKG@EFMIGCKAOCKBAFBBAAK@OEEMIISC@MBDJC@O@KFeECBMJEB_@QEIBGHC@MMECEBGJCBK@CCACACBQHS@I@EGIMIMKMAQ@QAGCIIEAIA]DKAIECKBOJ]BEFEJApARAhHFECCKEEGFWJOHAD@LFNBB@FEHAPFD@BICG]QOaOQ@CPQL@LCnPDBJ@DE@EACIGAC@CTBDAFC@QGMCASMkGKCMKIICEBCDCDQHMCMBEHCNDHBB@@CIGAEBG@@JBJDJAFC@A@ECEIG…cKKGA]FIDCDING@ƒgoYSCIAQBSFMDUESKIQGG@AFCAADKFCHA@CAAEAACICAOEEYAUIEGIECCBEEIKQSGQ@KAYDQDQBGDELGDAFBBDPAFBFLP@HAPBDPLDF@JEJ@BFNLLFD`NPJJLRDTPD@D@VED@LDNALBF@FGBIBCDADBBDATDDLDJR@HEFAJFHT@DDCN@HBDHHFFAFKJAFAFBHNJNNDBFLJTNH^DJDBLAHBBRJFHBBP@ddFFBJAJGLCBGBgGo@QAUCYKI@GBAB@FDH@FEDGAGGG@IDM@UIECGIAENONY@OEGGUc[IMGQKIDOFGBIEE@EBEHADC@EGEKAIGKCGIUGG@IBEBEHAH@J@DLV@BAFUPeRMA[GECmNG@•MW@Q@SFaT}|CHI^G@BGBI@EBIFEJE@GGYEIOCMFEDCAECCCBGNM@EMQK@IgGOQIQGUOKDA@OMBIrqLGLENBLJLBHHrPHFFHFBR@JCLITA^DVDT@JEFEPQDETIP@fOHMBEEGACJOJGDMAEINAHSLCHIDSNIB[CKBCA@CHECASOICWLEBG@UFMII@EACCOo@CMEEFE@CG@CAGEAI@OFGACBMGQEE@CB@BBFABMBA@@DEB@FCDEDMFE@GEE@GHQAMLEBICCBCDFD@FAD]LM@CDOVLJ@BKRKFAJIDMR@JBDILCDWA@FKDSLEA@CEAE@CDGBS@MEUCMAEBMPKBCA@CAAG@AABAZIBGICG@CBIBIDMBOAAE@MIOEEUCCBCDG@CB@KCDG@AA@C@AFCBEEEIBIE@EEGGCCBA@EAAEED@DGCA@@DDFF@BJABEB@HUBE@EAUWGQG…CCIDADIHUJGBCEIYII]GEBQX@TGHMZCFMFCAEIGCIMCCMEG@C@IIAEC@CBGAEDE@GAAGAAGHEBQ@CA@CAAO@AD@DEHBJEDADCFIBBBBDEHBFCD@HC@CA@KAAIACBCDA@OCK@QHCDBFFHLHJBBD@FEFEFMJCFCBC@MMCAI@_DGCBMACKFEAAMACGA@EBEF@@CIIACDI@AGEKFC@ECCC@CPO@CEEACFG@AECACCAE@IHEBS@KAQGKEEICUOMCKBGFEPBFEBKG[GECAM@CDSVE@UAKBaIGCCC[G@C@ICCOGAKIMaSUGCNBBGDAJOCFEMGCJ@L@FD@BDCFWT@DPL@^CHMFOFIBABFLEJEFS@GBCDC@EAUBCG@G@AFADCAKJABGAGQGGIC@GEAE@QCIDQAEGMHE^OTGFCIOFKIA@ICEBEFCRAHEFECGJGHKDCFAF@RKFGAICICUGC[QEA[FMF@FABEB{BQ[GGGCEEMICCAYLCBA@CACCAE@CDABC@@CC@G@DICCUIGICFDPAPAFGHELBHADEJEFDFTNEPDF@DKHKDSNQDEDKNIBEAGGC@CAMOECK@DH@LIDCD@HFN@DCDEABECGEAOBCCAECCIBABBV@PCDUH@HCB@HAJBB@B@LHHHBFLJFBFBJCHEFID@DHFBFAJBFJNRJXJHHD@BID@F@JLJT@JGXZn@JENNP@FEFC@KBKGEACBGBIBKFEJCHDD@FDJAPDJ@LFP@HGRFN@FAHDHF@FNDRALLN@FCNCBOHUBIHCDBDFJLJCFDLLPD@FCFDD@HCD@@NFT@JLHDH@\\BJLVHJBPDF@FCFDFDBJ@FFHj@HAJEHEHMJCFJXBBVBH@D@BDAFFFZDHCJAJFJAPFHLDDGTNLBH@JBLFB@DGJCFI^e^EJHPLPTBLG@KFGJGPCJBLFPNHBZMNARBREV@LDHHBLANFHRNXDRFJHXL@DCHDDHDBLEFAHBLJJFDFALEFHDBTRDLDPDJJLHLRNBNJXHFRFDFHHBLBFBBJ@D@BGHETCHDJRDBBDCF@LS@@NBNECIAI@EB@LNZBJKEC@@BBH@BED@DHHFDF@HGNCJAR@TIF@LBFCDGHgCSDEPICKMQDIHABEDAF@FHHGJAJJFDZAFBJA@HBBF@JEDGB@JJB@AGBEH@BDBBBCD@FDD@@AFBBAHCXADC@GCGBILINCBC@IBCD@F@DC@EBAFC@KbFBDEZIJADATBBLBTCVHFDFADDBDEHBPFDPDHDF@FBDDNEFGDAJJHBBHFFAFEDQHI@IFADBHJbBLCJCFGBKAE@@B@DFJ@H@N@L@LDFCDDFLEJBVHH`@HDFD@F@HGJ@LEHBHC@GBCAMHGBAFFFADE@GBCDBBDF@DDJABIBAD@BJFHFJAFKHCJKFBFBD@BEBCCKJCAAFABG@MGSPKTC@E@EBAHGDADD@H@BDCLAL@XFBBH@FCFN^HFDBLEB@BBBJFDVAAH@LCHBFFDBF@HFBJD@FCN@NDDN@LFNR@BAPGHIJCDCPAPDNLBBBDJLPBF@DNdNH~ZLHNDLHFHD@AHHBAHEB@F@JCBFHJHTTVPLFfJl@LEJK@IDMHKJIPFLDJHTTRZDL@RLTDNE^N\\XRBD@BENBHCHFFAFD\\@JN@FHFAFCFAFDBDBJBDVCFBDH@FELBFH@DGHABI@A@ABAHBDAD@HFHCBBLFDFB@DAFEDALALDDJB@PFD@NAFBFCBC\\CDCF@HE@EIQBEPQ@ACIECCG@EAAGDAAGEC@ECAKDGFE@ECE@GDGBWFCLBJEH@vGDGIM@OC@C@ACEKEGCIHCDCACD@JFPBFADB@FBBDEHACCBCVQACDKHAFC@EIGAOBALC@GBGGC@EBCFB@A@CEADGEIHMMIDGCC@KIEEA"]],"encodeOffsets":[[[123250,27563]],[[122541,27268]],[[123020,27189]],[[122916,27125]],[[121678,27068]],[[123398,27612]],[[123294,27747]],[[123611,27636]],[[123592,27651]],[[123587,27574]],[[123587,27576]],[[123438,27501]],[[123358,27630]],[[123380,27622]],[[123263,27607]],[[123185,27583]],[[123137,27586]],[[123136,27581]],[[123105,27518]],[[123002,27474]],[[123025,27443]],[[123021,27325]],[[123237,27343]],[[123240,27281]],[[123209,27290]],[[122984,27247]],[[123034,27193]],[[123016,27168]],[[123017,27126]],[[122884,27182]],[[122850,27191]],[[122865,27137]],[[122785,27331]],[[122683,27314]],[[122653,27317]],[[122636,27252]],[[122672,27239]],[[122677,27206]],[[122569,28102]]]},"properties":{"cp":[119.527082,26.95924],"name":"宁德市","childNum":39}}],"UTF8Encoding":true});
}));
ÏîÄ¿´úÂë/BigScreenVue/src/main.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import dataV from '@jiaminghi/data-view';
// å¼•入全局css
import './assets/scss/style.scss';
// æŒ‰éœ€å¼•å…¥vue-awesome图标
import Icon from 'vue-awesome/components/Icon';
import 'vue-awesome/icons/chart-bar.js';
import 'vue-awesome/icons/chart-area.js';
import 'vue-awesome/icons/chart-pie.js';
import 'vue-awesome/icons/chart-line.js';
import 'vue-awesome/icons/align-left.js';
import ElementUI from 'element-ui';
import axios from 'axios';
import VueAxios from 'vue-axios';
//引入echart
//4.x å¼•用方式
import echarts from 'echarts'
//5.x å¼•用方式为按需引用
//希望使用5.x版本的话,需要在package.json中更新版本号,并切换引用方式
//import * as echarts from 'echarts'
Vue.prototype.$echarts = echarts
Vue.config.productionTip = false;
Vue.use(VueAxios, axios)
// å…¨å±€æ³¨å†Œ
Vue.component('icon', Icon);
Vue.use(dataV);
Vue.use(ElementUI)
new Vue({
  router,
  store,
  render: (h) => h(App),
}).$mount('#app');
ÏîÄ¿´úÂë/BigScreenVue/src/router/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const routes = [{
  path: '/',
  name: 'index',
  component: () => import('../views/index.vue')
}]
const router = new VueRouter({
  routes
})
export default router
ÏîÄ¿´úÂë/BigScreenVue/src/store/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})
ÏîÄ¿´úÂë/BigScreenVue/src/utils/drawMixin.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
// å±å¹•适配 mixin å‡½æ•°
// * é»˜è®¤ç¼©æ”¾å€¼
const scale = {
  width: '1',
  height: '1',
}
// * è®¾è®¡ç¨¿å°ºå¯¸ï¼ˆpx)
const baseWidth = 1920
const baseHeight = 1080
// * éœ€ä¿æŒçš„æ¯”例(默认1.77778)
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
export default {
  data() {
    return {
      // * å®šæ—¶å‡½æ•°
      drawTiming: null
    }
  },
  mounted () {
    this.calcRate()
    window.addEventListener('resize', this.resize)
  },
  beforeDestroy () {
    window.removeEventListener('resize', this.resize)
  },
  methods: {
    calcRate () {
      const appRef = this.$refs["appRef"]
      if (!appRef) return
      // å½“前宽高比
      const currentRate = parseFloat((window.innerWidth / window.innerHeight).toFixed(5))
      if (appRef) {
        if (currentRate > baseProportion) {
          // è¡¨ç¤ºæ›´å®½
          scale.width = ((window.innerHeight * baseProportion) / baseWidth).toFixed(5)
          scale.height = (window.innerHeight / baseHeight).toFixed(5)
          appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`
        } else {
          // è¡¨ç¤ºæ›´é«˜
          scale.height = ((window.innerWidth / baseProportion) / baseHeight).toFixed(5)
          scale.width = (window.innerWidth / baseWidth).toFixed(5)
          appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`
        }
      }
    },
    resize () {
      clearTimeout(this.drawTiming)
      this.drawTiming = setTimeout(() => {
        this.calcRate()
      }, 200)
    }
  },
}
ÏîÄ¿´úÂë/BigScreenVue/src/utils/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
/**
 * @param {Function} fn é˜²æŠ–函数
 * @param {Number} delay å»¶è¿Ÿæ—¶é—´
 */
export function debounce(fn, delay) {
  var timer;
  return function () {
    var context = this;
    var args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      fn.apply(context, args);
    }, delay);
  };
}
/**
 * @param {date} time éœ€è¦è½¬æ¢çš„æ—¶é—´
 * @param {String} fmt éœ€è¦è½¬æ¢çš„æ ¼å¼ å¦‚ yyyy-MM-dd、yyyy-MM-dd HH:mm:ss
 */
export function formatTime(time, fmt) {
  if (!time) return '';
  else {
    const date = new Date(time);
    const o = {
      'M+': date.getMonth() + 1,
      'd+': date.getDate(),
      'H+': date.getHours(),
      'm+': date.getMinutes(),
      's+': date.getSeconds(),
      'q+': Math.floor((date.getMonth() + 3) / 3),
      S: date.getMilliseconds(),
    };
    if (/(y+)/.test(fmt))
      fmt = fmt.replace(
        RegExp.$1,
        (date.getFullYear() + '').substr(4 - RegExp.$1.length)
      );
    for (const k in o) {
      if (new RegExp('(' + k + ')').test(fmt)) {
        fmt = fmt.replace(
          RegExp.$1,
          RegExp.$1.length === 1
            ? o[k]
            : ('00' + o[k]).substr(('' + o[k]).length)
        );
      }
    }
    return fmt;
  }
}
ÏîÄ¿´úÂë/BigScreenVue/src/utils/resizeMixin.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
// æ··å…¥ä»£ç  resize-mixins.js
import { debounce } from '@/utils';
const resizeChartMethod = '$__resizeChartMethod';
export default {
  data() {
    // åœ¨ç»„件内部将图表 init çš„引用映射到 chart å±žæ€§ä¸Š
    return {
      chart: null,
    };
  },
  created() {
    window.addEventListener('resize', this[resizeChartMethod], false);
  },
  activated() {
    // é˜²æ­¢ keep-alive ä¹‹åŽå›¾è¡¨å˜å½¢
    if (this.chart) {
      this.chart.resize()
    }
  },
  beforeDestroy() {
    window.removeEventListener('reisze', this[resizeChartMethod]);
  },
  methods: {
    // é˜²æŠ–函数来控制 resize çš„频率
    [resizeChartMethod]: debounce(function() {
      if (this.chart) {
        this.chart.resize();
      }
    }, 300),
  },
};
ÏîÄ¿´úÂë/BigScreenVue/src/views/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1331 @@
<template>
  <div class="screen-container">
    <div id="index" class="dashboard-screen">
      <div class="bg">
        <!-- é¡¶éƒ¨æ ‡é¢˜æ  -->
        <div class="screen-header">
          <div class="header-content">
            <h1 class="main-title">
              <i class="el-icon-monitor title-icon"></i>
              æ˜Žå’Œæ™ºèƒ½ä»“储数据大屏
            </h1>
            <div class="header-info">
              <div class="current-time">{{ currentTime }}</div>
            </div>
          </div>
        </div>
        <!-- æ•°æ®æ€»è§ˆéƒ¨åˆ† -->
        <div class="screen-section">
          <div class="section-title">
            <div class="title-decoration"></div>
            <h2>数据总览</h2>
            <div class="title-decoration"></div>
          </div>
          <div class="metrics-grid-large">
            <div class="metric-card-large" v-for="(item, index) in dataMetrics" :key="`metric-${index}-${refreshKey}`"
              :class="getMetricCardClass(item.name)">
              <div class="metric-glow"></div>
              <div class="metric-content">
                <div class="metric-icon-large">
                  <i :class="getMetricIcon(item.name)"></i>
                </div>
                <div class="metric-info-large">
                  <div class="metric-name-large">{{ item.name }}</div>
                  <div class="metric-value-large">{{ formatNumber(item.value) }}</div>
                  <div class="metric-compare-large" v-if="item.compare !== undefined">
                    <span :class="getCompareClass(item.compare)">
                      <i :class="getCompareIcon(item.compare)"></i>
                      {{ formatCompareValue(item.compare) }}
                    </span>
                    <span class="compare-label">较昨日</span>
                  </div>
                </div>
              </div>
              <div class="metric-wave">
                <div class="wave"></div>
              </div>
            </div>
          </div>
        </div>
        <!-- ä¸­é—´å†…容区域 -->
        <div class="screen-main">
          <!-- å·¦ä¾§å›¾è¡¨ -->
          <div class="main-left">
            <div class="chart-container-large">
              <div class="chart-header-large">
                <h3 class="chart-title-large">
                  <i class="el-icon-trend-charts"></i>
                  å‡ºåº“量趋势
                </h3>
                <div class="chart-subtitle-large">近7日出库统计</div>
              </div>
              <div class="chart-content-large">
                <div v-if="loading" class="chart-loading-large">
                  <i class="el-icon-loading"></i>
                  <span>数据加载中...</span>
                </div>
                <div v-else-if="error" class="chart-error-large">
                  <i class="el-icon-warning"></i>
                  <span>数据加载失败</span>
                </div>
                <div v-else-if="!chartData.outbound.values.length" class="chart-no-data-large">
                  <i class="el-icon-data-line"></i>
                  <span>暂无出库数据</span>
                </div>
                <div v-else ref="outboundChart" class="chart-large"></div>
              </div>
            </div>
            <div class="chart-container-large">
              <div class="chart-header-large">
                <h3 class="chart-title-large">
                  <i class="el-icon-trend-charts"></i>
                  å…¥åº“量趋势
                </h3>
                <div class="chart-subtitle-large">近7日入库统计</div>
              </div>
              <div class="chart-content-large">
                <div v-if="loading" class="chart-loading-large">
                  <i class="el-icon-loading"></i>
                  <span>数据加载中...</span>
                </div>
                <div v-else-if="error" class="chart-error-large">
                  <i class="el-icon-warning"></i>
                  <span>数据加载失败</span>
                </div>
                <div v-else-if="!chartData.inbound.values.length" class="chart-no-data-large">
                  <i class="el-icon-data-line"></i>
                  <span>暂无入库数据</span>
                </div>
                <div v-else ref="inboundChart" class="chart-large"></div>
              </div>
            </div>
          </div>
          <!-- ä¸­é—´ä»»åŠ¡çœ‹æ¿ -->
          <div class="main-center">
            <div class="task-board-large">
              <div class="board-header-large">
                <div class="header-title">
                  <i class="el-icon-s-management"></i>
                  <span>当前生产任务</span>
                </div>
                <div class="task-count-large">
                  <span class="count-number">{{ tableData.length }}</span>
                  <span class="count-label">个任务</span>
                </div>
              </div>
              <div class="board-body-large">
                <div class="scroll-table-container-large" @mouseenter="pauseScroll" @mouseleave="resumeScroll">
                  <div class="table-body-container-large" ref="tableBody">
                    <div class="table-body-wrapper-large" :style="{ transform: `translateY(-${scrollPosition}px)` }">
                      <table class="body-table-large">
                        <tbody>
                          <tr v-for="(row, index) in tableData" :key="`task-${index}-${refreshKey}`"
                            :class="getRowClass(index)">
                            <td class="cell-index">{{ index + 1 }}</td>
                            <td class="cell-pallet">{{ row.palletCode || '无' }}</td>
                            <td class="cell-address">{{ row.sourceAddress || '无' }}</td>
                            <td class="cell-address">{{ row.targetAddress || '无' }}</td>
                            <td class="cell-type">{{ row.taskType || '无' }}</td>
                            <td class="cell-status">
                              <span class="status-tag-large" :class="getStatusClass(row.taskState)">
                                {{ row.taskState || '无' }}
                              </span>
                            </td>
                            <td class="cell-time">{{ formatDateTime(row.createDate) || '无' }}</td>
                          </tr>
                        </tbody>
                      </table>
                      <table class="body-table-large" v-if="tableData.length > rowNum">
                        <tbody>
                          <tr v-for="(row, index) in tableData" :key="`task-copy-${index}-${refreshKey}`"
                            :class="getRowClass(index)">
                            <td class="cell-index">{{ index + tableData.length + 1 }}</td>
                            <td class="cell-pallet">{{ row.palletCode || '无' }}</td>
                            <td class="cell-address">{{ row.sourceAddress || '无' }}</td>
                            <td class="cell-address">{{ row.targetAddress || '无' }}</td>
                            <td class="cell-type">{{ row.taskType || '无' }}</td>
                            <td class="cell-status">
                              <span class="status-tag-large" :class="getStatusClass(row.taskState)">
                                {{ row.taskState || '无' }}
                              </span>
                            </td>
                            <td class="cell-time">{{ formatDateTime(row.createDate) || '无' }}</td>
                          </tr>
                        </tbody>
                      </table>
                    </div>
                  </div>
                </div>
                <div v-if="tableData.length === 0" class="no-data-board-large">
                  <i class="el-icon-document"></i>
                  <span>暂无生产任务数据</span>
                </div>
              </div>
            </div>
          </div>
          <!-- å³ä¾§å›¾è¡¨ -->
          <div class="main-right">
            <div class="chart-container-full">
              <div class="chart-header-large">
                <h3 class="chart-title-large">
                  <i class="el-icon-data-line"></i>
                  æœˆåº¦å‡ºå…¥åº“对比
                </h3>
                <div class="chart-subtitle-large">本月每日出入库量统计</div>
              </div>
              <div class="chart-content-full">
                <div v-if="loading" class="chart-loading-large">
                  <i class="el-icon-loading"></i>
                  <span>数据加载中...</span>
                </div>
                <div v-else-if="error" class="chart-error-large">
                  <i class="el-icon-warning"></i>
                  <span>数据加载失败</span>
                </div>
                <div v-else-if="!chartData.monthData.inValue.length || !chartData.monthData.outValue.length"
                  class="chart-no-data-large">
                  <i class="el-icon-data-line"></i>
                  <span>暂无出入库数据</span>
                </div>
                <div v-else ref="monthDataChart" class="chart-full"></div>
              </div>
            </div>
          </div>
        </div>
        <!-- èƒŒæ™¯è£…饰元素 -->
        <div class="decoration-corner top-left"></div>
        <div class="decoration-corner top-right"></div>
        <div class="decoration-corner bottom-left"></div>
        <div class="decoration-corner bottom-right"></div>
      </div>
    </div>
  </div>
</template>
<script>
import http from '../api/ajax.js';
import * as echarts from 'echarts';
export default {
  name: 'DashboardScreen',
  data() {
    return {
      // å“åº”式数据
      dataMetrics: [],
      tableData: [],
      chartData: {
        outbound: { dates: [], values: [] },
        inbound: { dates: [], values: [] },
        monthData: { dates: [], inValue: [], outValue: [] }
      },
      loading: true,
      error: false,
      refreshing: false,
      refreshKey: 0,
      // æ»šåŠ¨ç›¸å…³
      scrollPosition: 0,
      isScrolling: true,
      scrollInterval: null,
      rowNum: 6,
      rowHeight: 60,
      // å½“前时间
      currentTime: '',
      // å›¾è¡¨å®žä¾‹
      outboundInstance: null,
      inboundInstance: null,
      monthDataInstance: null,
      // ç¼©æ”¾æŽ§åˆ¶
      scaleRatio: 1,
      // å›¾æ ‡å¼•用
      refreshIcon: 'el-icon-refresh'
    };
  },
  mounted() {
    this.updateScale();
    this.fetchData();
    this.timeInterval = setInterval(this.updateCurrentTime, 1000);
    this.dataInterval = setInterval(this.fetchData, 300000); // 5分钟
    // æ·»åŠ çª—å£è°ƒæ•´ç›‘å¬
    window.addEventListener('resize', this.handleResize);
    window.addEventListener('resize', this.updateScale);
  },
  beforeDestroy() {
    clearInterval(this.timeInterval);
    clearInterval(this.dataInterval);
    this.pauseScroll();
    // æ¸…理图表实例
    [this.outboundInstance, this.inboundInstance, this.monthDataInstance].forEach(instance => {
      if (instance) instance.dispose();
    });
    // ç§»é™¤çª—口调整监听
    window.removeEventListener('resize', this.handleResize);
    window.removeEventListener('resize', this.updateScale);
  },
  methods: {
    // åŠ¨æ€ç¼©æ”¾å‡½æ•°
    updateScale() {
      const baseWidth = 1920;
      const baseHeight = 1080;
      const windowWidth = window.innerWidth;
      const windowHeight = window.innerHeight;
      // è®¡ç®—宽高比例
      const widthRatio = windowWidth / baseWidth;
      const heightRatio = windowHeight / baseHeight;
      // æ ¹æ®å®½é«˜æ¯”决定缩放策略
      let scale;
      if (windowWidth / windowHeight > baseWidth / baseHeight) {
        // å®½å±ï¼ŒæŒ‰é«˜åº¦ç¼©æ”¾
        scale = heightRatio;
      } else {
        // é«˜å±ï¼ŒæŒ‰å®½åº¦ç¼©æ”¾
        scale = widthRatio;
      }
      // é™åˆ¶ç¼©æ”¾èŒƒå›´
      scale = Math.max(0.5, Math.min(scale, 2));
      this.scaleRatio = scale;
      // åº”用缩放
      const screenElement = document.getElementById('index');
      if (screenElement) {
        screenElement.style.transform = `translate(-50%, -50%) scale(${scale})`;
      }
      console.log(`窗口尺寸: ${windowWidth}x${windowHeight}, ç¼©æ”¾æ¯”例: ${scale.toFixed(3)}`);
    },
    // æ ¼å¼åŒ–函数
    formatNumber(num) {
      if (num === undefined || num === null) return '0';
      return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
    },
    formatCompareValue(value) {
      if (value === 0) return '0';
      return value > 0 ? `+${this.formatNumber(value)}` : this.formatNumber(value);
    },
    formatDateTime(dateString) {
      if (!dateString) return '';
      try {
        const date = new Date(dateString);
        return date.toLocaleString('zh-CN', {
          month: '2-digit',
          day: '2-digit',
          hour: '2-digit',
          minute: '2-digit'
        });
      } catch {
        return dateString;
      }
    },
    // æ ·å¼ç±»å‡½æ•°
    getCompareClass(compare) {
      if (compare > 0) return 'compare-positive';
      if (compare < 0) return 'compare-negative';
      return 'compare-zero';
    },
    getCompareIcon(compare) {
      if (compare > 0) return 'el-icon-top';
      if (compare < 0) return 'el-icon-bottom';
      return 'el-icon-minus';
    },
    getMetricCardClass(name) {
      const classMap = {
        '今日进库量': 'metric-inbound-today',
        '今日出库量': 'metric-outbound-today',
        '本月进库量': 'metric-inbound-month',
        '本月出库量': 'metric-outbound-month',
        '库存总量': 'metric-total'
      };
      return classMap[name] || '';
    },
    getMetricIcon(type) {
      const iconMap = {
        '今日进库量': 'el-icon-download',
        '今日出库量': 'el-icon-upload2',
        '本月进库量': 'el-icon-download',
        '本月出库量': 'el-icon-upload2',
        '库存总量': 'el-icon-box',
      };
      return iconMap[type] || 'el-icon-data-board';
    },
    getStatusClass(status) {
      const statusMap = {
        '进行中': 'status-primary',
        '已完成': 'status-success',
        '已取消': 'status-info',
        '异常': 'status-danger',
        '待执行': 'status-warning'
      };
      return statusMap[status] || 'status-primary';
    },
    getRowClass(index) {
      return index % 2 === 0 ? 'even-row' : 'odd-row';
    },
    // æ—¶é—´æ›´æ–°
    updateCurrentTime() {
      const now = new Date();
      this.currentTime = now.toLocaleString('zh-CN', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit'
      });
    },
    // æ»šåŠ¨æŽ§åˆ¶
    startScrolling() {
      if (this.tableData.length <= this.rowNum) {
        this.isScrolling = false;
        return;
      }
      this.isScrolling = true;
      const totalHeight = this.tableData.length * this.rowHeight;
      this.scrollInterval = setInterval(() => {
        this.scrollPosition += 1;
        if (this.scrollPosition >= totalHeight) {
          this.scrollPosition = 0;
        }
      }, 40);
    },
    pauseScroll() {
      if (this.scrollInterval) {
        clearInterval(this.scrollInterval);
        this.scrollInterval = null;
      }
      this.isScrolling = false;
    },
    resumeScroll() {
      if (this.tableData.length > this.rowNum) {
        this.startScrolling();
      }
    },
    // å›¾è¡¨åˆå§‹åŒ–
    initCharts() {
      console.log('初始化图表...');
      console.log('outbound数据:', this.chartData.outbound);
      console.log('inbound数据:', this.chartData.inbound);
      console.log('monthData数据:', this.chartData.monthData);
      if (!this.$refs.outboundChart || !this.$refs.inboundChart || !this.$refs.monthDataChart) {
        console.log('图表容器未找到');
        return;
      }
      // æ¸…理旧实例
      [this.outboundInstance, this.inboundInstance, this.monthDataInstance].forEach(instance => {
        if (instance) {
          instance.dispose();
        }
      });
      try {
        this.outboundInstance = echarts.init(this.$refs.outboundChart);
        this.inboundInstance = echarts.init(this.$refs.inboundChart);
        this.monthDataInstance = echarts.init(this.$refs.monthDataChart);
        // å¤§å±å›¾è¡¨é…ç½®
        const chartOptions = {
          backgroundColor: 'transparent',
          grid: {
            left: '3%',
            right: '3%',
            bottom: '10%',
            top: '15%',
            containLabel: true
          },
          textStyle: {
            color: '#fff',
            fontSize: 14
          }
        };
        // å‡ºåº“量图表配置
        const outboundOption = {
          ...chartOptions,
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'shadow'
            },
            formatter: function (params) {
              const data = params[0];
              return `
                <div style="font-weight: 600; margin-bottom: 8px; color: #303133;">${data.name}</div>
                <div style="display: flex; align-items: center; font-size: 14px;">
                  <span style="display: inline-block; width: 8px; height: 8px; background: ${data.color}; border-radius: 50%; margin-right: 8px;"></span>
                  <span style="color: #606266;">出库量: </span>
                  <span style="font-weight: 600; margin-left: 8px; color: #303133;">${data.value}</span>
                </div>
              `;
            },
            backgroundColor: 'rgba(255, 255, 255, 0.95)',
            borderColor: '#e4e7ed',
            borderWidth: 1,
            textStyle: {
              color: '#303133'
            }
          },
          xAxis: {
            type: 'category',
            data: this.chartData.outbound.dates,
            axisLine: { lineStyle: { color: 'rgba(255,255,255,0.3)' } },
            axisLabel: { color: 'rgba(255,255,255,0.7)', rotate: 45, fontSize: 12 }
          },
          yAxis: {
            type: 'value',
            axisLine: { lineStyle: { color: 'rgba(255,255,255,0.3)' } },
            axisLabel: { color: 'rgba(255,255,255,0.7)', fontSize: 12 },
            splitLine: { lineStyle: { color: 'rgba(255,255,255,0.1)', type: 'dashed' } }
          },
          series: [{
            name: '出库量',
            data: this.chartData.outbound.values,
            type: 'bar',
            itemStyle: {
              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                { offset: 0, color: '#ff7b7b' },
                { offset: 1, color: '#ff3b3b' }
              ])
            },
            barWidth: '40%'
          }]
        };
        // å…¥åº“量图表配置
        const inboundOption = {
          ...chartOptions,
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'line'
            },
            formatter: function (params) {
              const data = params[0];
              return `
                <div style="font-weight: 600; margin-bottom: 8px; color: #303133;">${data.name}</div>
                <div style="display: flex; align-items: center; font-size: 14px;">
                  <span style="display: inline-block; width: 8px; height: 8px; background: ${data.color}; border-radius: 50%; margin-right: 8px;"></span>
                  <span style="color: #606266;">入库量: </span>
                  <span style="font-weight: 600; margin-left: 8px; color: #303133;">${data.value}</span>
                </div>
              `;
            },
            backgroundColor: 'rgba(255, 255, 255, 0.95)',
            borderColor: '#e4e7ed',
            borderWidth: 1,
            textStyle: {
              color: '#303133'
            }
          },
          xAxis: {
            type: 'category',
            data: this.chartData.inbound.dates,
            axisLine: { lineStyle: { color: 'rgba(255,255,255,0.3)' } },
            axisLabel: { color: 'rgba(255,255,255,0.7)', rotate: 45, fontSize: 12 }
          },
          yAxis: {
            type: 'value',
            axisLine: { lineStyle: { color: 'rgba(255,255,255,0.3)' } },
            axisLabel: { color: 'rgba(255,255,255,0.7)', fontSize: 12 },
            splitLine: { lineStyle: { color: 'rgba(255,255,255,0.1)', type: 'dashed' } }
          },
          series: [{
            name: '入库量',
            data: this.chartData.inbound.values,
            type: 'line',
            smooth: true,
            lineStyle: { color: '#36a3ff', width: 3 },
            itemStyle: { color: '#36a3ff' },
            areaStyle: {
              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                { offset: 0, color: 'rgba(54, 163, 255, 0.5)' },
                { offset: 1, color: 'rgba(54, 163, 255, 0.1)' }
              ])
            }
          }]
        };
        // æœˆåº¦æ•°æ®å›¾è¡¨é…ç½®
        const monthDataOption = {
          ...chartOptions,
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'cross'
            },
            formatter: function (params) {
              let html = `<div style="font-weight: 600; margin-bottom: 8px; color: #303133;">${params[0].name}</div>`;
              params.forEach(param => {
                html += `
                  <div style="display: flex; align-items: center; margin: 4px 0; font-size: 14px;">
                    <span style="display: inline-block; width: 8px; height: 8px; background: ${param.color}; border-radius: 50%; margin-right: 8px;"></span>
                    <span style="color: #606266;">${param.seriesName}: </span>
                    <span style="font-weight: 600; margin-left: 8px; color: #303133;">${param.value}</span>
                  </div>
                `;
              });
              return html;
            },
            backgroundColor: 'rgba(255, 255, 255, 0.95)',
            borderColor: '#e4e7ed',
            borderWidth: 1,
            textStyle: {
              color: '#303133'
            }
          },
          legend: {
            data: ['入库量', '出库量'],
            bottom: 10,
            textStyle: { color: 'rgba(255,255,255,0.7)', fontSize: 12 }
          },
          xAxis: {
            type: 'category',
            data: this.chartData.monthData.dates,
            axisLine: { lineStyle: { color: 'rgba(255,255,255,0.3)' } },
            axisLabel: { color: 'rgba(255,255,255,0.7)', rotate: 45, fontSize: 12 }
          },
          yAxis: {
            type: 'value',
            axisLine: { lineStyle: { color: 'rgba(255,255,255,0.3)' } },
            axisLabel: { color: 'rgba(255,255,255,0.7)', fontSize: 12 },
            splitLine: { lineStyle: { color: 'rgba(255,255,255,0.1)', type: 'dashed' } }
          },
          series: [
            {
              name: '入库量',
              data: this.chartData.monthData.inValue,
              type: 'line',
              smooth: true,
              lineStyle: { color: '#36a3ff', width: 3 },
              itemStyle: { color: '#36a3ff' }
            },
            {
              name: '出库量',
              data: this.chartData.monthData.outValue,
              type: 'line',
              smooth: true,
              lineStyle: { color: '#ff6b6b', width: 3 },
              itemStyle: { color: '#ff6b6b' }
            }
          ]
        };
        // è®¾ç½®å›¾è¡¨é€‰é¡¹
        this.outboundInstance.setOption(outboundOption);
        this.inboundInstance.setOption(inboundOption);
        this.monthDataInstance.setOption(monthDataOption);
        console.log('图表初始化完成');
      } catch (error) {
        console.error('图表初始化失败:', error);
      }
    },
    // çª—口调整
    handleResize() {
      [this.outboundInstance, this.inboundInstance, this.monthDataInstance].forEach(instance => {
        if (instance) {
          try {
            instance.resize();
          } catch (error) {
            console.error('图表调整大小失败:', error);
          }
        }
      });
    },
    // æ•°æ®å¤„理
    handleDataUpdate(data) {
      console.log('处理数据更新:', data);
      // å¤„理指标数据
      if (data.metrics && Array.isArray(data.metrics)) {
        this.dataMetrics = data.metrics.map(item => ({
          name: item.name || '未知指标',
          value: item.value != null ? item.value : 0,
          compare: item.compare != null ? item.compare : 0
        }));
      }
      // å¤„理出库数据
      if (data.outbound) {
        this.chartData.outbound.dates = data.outbound.dates || [];
        this.chartData.outbound.values = data.outbound.values || [];
      }
      // å¤„理入库数据
      if (data.inbound) {
        this.chartData.inbound.dates = data.inbound.dates || [];
        this.chartData.inbound.values = data.inbound.values || [];
      }
      // å¤„理月度数据
      if (data.monthData) {
        this.chartData.monthData.dates = data.monthData.dates || [];
        this.chartData.monthData.inValue = data.monthData.inValue || [];
        this.chartData.monthData.outValue = data.monthData.outValue || [];
      }
      // å¤„理任务数据
      if (data.newTask && Array.isArray(data.newTask)) {
        this.tableData = data.newTask.map(task => ({
          palletCode: task.palletCode || '无',
          sourceAddress: task.sourceAddress || '无',
          targetAddress: task.targetAddress || '无',
          taskType: task.taskType || '无',
          taskState: task.taskState || '无',
          createDate: task.createDate || '无',
        }));
        this.$nextTick(() => {
          this.pauseScroll();
          this.startScrolling();
        });
      } else {
        this.tableData = [];
        this.pauseScroll();
      }
      console.log('处理后的图表数据:', this.chartData);
      this.refreshKey++;
      // å»¶è¿Ÿåˆå§‹åŒ–图表,确保DOM已更新
      this.$nextTick(() => {
        setTimeout(() => {
          this.initCharts();
        }, 100);
      });
    },
    // æ•°æ®èŽ·å–
    async fetchData() {
      try {
        this.loading = true;
        this.refreshing = true;
        console.log('开始获取数据...');
        const response = await http.post("api/StockInfo/GetStockData", {});
        console.log('API响应:', response);
        if (response.data && response.data.data) {
          this.handleDataUpdate(response.data.data);
          this.error = false;
        } else {
          throw new Error('API返回数据格式错误');
        }
      } catch (err) {
        console.error('API请求失败:', err);
        this.error = true;
      } finally {
        this.loading = false;
        this.refreshing = false;
        this.updateCurrentTime();
      }
    },
    handleRefresh() {
      this.fetchData();
    }
  }
};
</script>
<style scoped lang="css">
/* å…¨å±€æ ·å¼é‡ç½® */
:global(html),
:global(body) {
  margin: 0;
  padding: 0;
  overflow: hidden;
  width: 100%;
  height: 100%;
}
/* å¤–层容器 - å…¨å±æŽ§åˆ¶ */
.screen-container {
  width: 100vw;
  height: 100vh;
  overflow: hidden;
  background: #000;
  position: relative;
}
/* å¤§å±å†…容 - å›ºå®š1920x1080尺寸 */
#index {
  color: #d3d6dd;
  width: 1920px;
  height: 1080px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  transform-origin: center center;
  overflow: hidden;
  min-width: 1920px;
  min-height: 1080px;
  transition: transform 0.2s ease;
  /* é˜²æ­¢ç¼©æ”¾æ¨¡ç³Š */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
.bg {
  width: 100%;
  height: 100%;
  padding: 25px 16px 0 16px;
  background-image: url("../assets/bg5.jpg");
  background-size: cover;
  background-position: center center;
  background-repeat: no-repeat;
}
.dashboard-screen {
  width: 100%;
  height: 100%;
  color: #fff;
  position: relative;
  overflow: hidden;
  font-family: 'Microsoft YaHei', Arial, sans-serif;
}
/* é¡¶éƒ¨æ ‡é¢˜æ  */
.screen-header {
  background: rgba(16, 36, 71, 0.8);
  border-bottom: 1px solid rgba(64, 158, 255, 0.3);
  padding: 15px 30px;
  backdrop-filter: blur(10px);
  border-radius: 10px;
  margin-bottom: 20px;
}
.header-content {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.main-title {
  font-size: 32px;
  font-weight: 700;
  background: linear-gradient(135deg, #409eff, #79bbff);
  background-clip: text;
  margin: 0;
  display: flex;
  align-items: center;
}
.title-icon {
  font-size: 36px;
  margin-right: 15px;
}
.header-info {
  display: flex;
  align-items: center;
  gap: 20px;
}
.current-time {
  font-size: 18px;
  color: rgba(255, 255, 255, 0.8);
}
.refresh-btn {
  background: linear-gradient(135deg, #409eff, #79bbff);
  border: none;
  border-radius: 25px;
  padding: 12px 24px;
  font-size: 16px;
  font-weight: 600;
}
/* åŒºåŸŸæ ‡é¢˜ */
.screen-section {
  padding: 0 16px 20px;
}
.section-title {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 20px;
  margin-bottom: 25px;
}
.section-title h2 {
  font-size: 24px;
  font-weight: 600;
  color: #fff;
  margin: 0;
}
.title-decoration {
  flex: 1;
  height: 2px;
  background: linear-gradient(90deg, transparent, #409eff, transparent);
}
/* æ•°æ®å¡ç‰‡ç½‘æ ¼ */
.metrics-grid-large {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 20px;
  margin-bottom: 20px;
}
.metric-card-large {
  background: rgba(16, 36, 71, 0.6);
  border: 1px solid rgba(64, 158, 255, 0.3);
  border-radius: 15px;
  padding: 25px;
  position: relative;
  overflow: hidden;
  transition: all 0.3s ease;
  backdrop-filter: blur(10px);
}
.metric-card-large:hover {
  transform: translateY(-5px);
  box-shadow: 0 10px 30px rgba(64, 158, 255, 0.2);
  border-color: rgba(64, 158, 255, 0.6);
}
.metric-glow {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 3px;
  background: linear-gradient(90deg, #409eff, #79bbff);
  opacity: 0.7;
}
.metric-content {
  display: flex;
  align-items: center;
  gap: 20px;
}
.metric-icon-large {
  width: 70px;
  height: 70px;
  border-radius: 15px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 32px;
  background: rgba(255, 255, 255, 0.1);
}
.metric-inbound-today .metric-icon-large {
  color: #67c23a;
}
.metric-outbound-today .metric-icon-large {
  color: #e6a23c;
}
.metric-inbound-month .metric-icon-large {
  color: #409eff;
}
.metric-outbound-month .metric-icon-large {
  color: #f56c6c;
}
.metric-total .metric-icon-large {
  color: #909399;
}
.metric-info-large {
  flex: 1;
}
.metric-name-large {
  font-size: 16px;
  color: rgba(255, 255, 255, 0.8);
  margin-bottom: 10px;
}
.metric-value-large {
  font-size: 36px;
  font-weight: 800;
  color: #fff;
  margin-bottom: 8px;
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
.metric-compare-large {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 14px;
}
.compare-positive {
  color: #f56c6c;
}
.compare-negative {
  color: #67c23a;
}
.compare-zero {
  color: rgba(255, 255, 255, 0.6);
}
.metric-wave {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  height: 20px;
  overflow: hidden;
}
.wave {
  width: 200%;
  height: 100%;
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
  animation: wave 3s linear infinite;
}
@keyframes wave {
  0% {
    transform: translateX(-50%);
  }
  100% {
    transform: translateX(0);
  }
}
/* ä¸»å†…容区域 */
.screen-main {
  display: grid;
  grid-template-columns: 1fr 1.2fr 1fr;
  gap: 20px;
  padding: 0 16px 20px;
  height: 450px;
}
/* å›¾è¡¨å®¹å™¨ */
.chart-container-large,
.chart-container-full {
  background: rgba(16, 36, 71, 0.6);
  border: 1px solid rgba(64, 158, 255, 0.3);
  border-radius: 15px;
  padding: 20px;
  backdrop-filter: blur(10px);
}
.chart-container-large {
  height: 350px;
}
.chart-container-full {
  height: 100%;
}
.chart-header-large {
  margin-bottom: 15px;
}
.chart-title-large {
  font-size: 18px;
  font-weight: 600;
  color: #fff;
  margin: 0 0 5px 0;
  display: flex;
  align-items: center;
  gap: 8px;
}
.chart-subtitle-large {
  font-size: 14px;
  color: rgba(255, 255, 255, 0.6);
}
.chart-content-large,
.chart-content-full {
  height: calc(100% - 60px);
  position: relative;
}
.chart-large,
.chart-full {
  height: 100%;
  width: 100%;
  min-height: 300px;
}
/* ä»»åŠ¡çœ‹æ¿ */
.task-board-large {
  background: rgba(16, 36, 71, 0.6);
  border: 1px solid rgba(64, 158, 255, 0.3);
  border-radius: 15px;
  height: 100%;
  backdrop-filter: blur(10px);
}
.board-header-large {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 20px;
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.header-title {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 18px;
  font-weight: 600;
}
.task-count-large {
  display: flex;
  align-items: baseline;
  gap: 5px;
}
.count-number {
  font-size: 28px;
  font-weight: 800;
  color: #409eff;
}
.count-label {
  font-size: 14px;
  color: rgba(255, 255, 255, 0.6);
}
.board-body-large {
  height: calc(100% - 80px);
  position: relative;
}
.scroll-table-container-large {
  height: 100%;
  overflow: hidden;
  position: relative;
}
.table-body-container-large {
  height: 100%;
  overflow: hidden;
}
.table-body-wrapper-large {
  transition: transform 0.5s ease;
}
.body-table-large {
  width: 100%;
  border-collapse: collapse;
}
.body-table-large td {
  padding: 15px 10px;
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
  font-size: 14px;
  height: 60px;
  box-sizing: border-box;
}
.cell-index {
  width: 60px;
  text-align: center;
}
.cell-pallet {
  width: 100px;
  text-align: center;
}
.cell-address {
  width: 120px;
  text-align: center;
}
.cell-type {
  width: 100px;
  text-align: center;
}
.cell-status {
  width: 100px;
  text-align: center;
}
.cell-time {
  width: 140px;
  text-align: center;
}
.even-row {
  background: rgba(255, 255, 255, 0.05);
}
.odd-row {
  background: rgba(255, 255, 255, 0.02);
}
.body-table-large tr:hover {
  background: rgba(64, 158, 255, 0.1) !important;
}
.status-tag-large {
  padding: 4px 12px;
  border-radius: 12px;
  font-size: 12px;
  font-weight: 600;
}
.status-primary {
  background: rgba(64, 158, 255, 0.2);
  color: #409eff;
}
.status-success {
  background: rgba(103, 194, 58, 0.2);
  color: #67c23a;
}
.status-warning {
  background: rgba(230, 162, 60, 0.2);
  color: #e6a23c;
}
.status-danger {
  background: rgba(245, 108, 108, 0.2);
  color: #f56c6c;
}
.status-info {
  background: rgba(144, 147, 153, 0.2);
  color: #909399;
}
.no-data-board-large {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100%;
  color: rgba(255, 255, 255, 0.6);
  font-size: 16px;
  gap: 10px;
}
.no-data-board-large i {
  font-size: 48px;
}
/* è£…饰角 */
.decoration-corner {
  position: absolute;
  width: 80px;
  height: 80px;
  border: 2px solid rgba(64, 158, 255, 0.5);
}
.top-left {
  top: 0;
  left: 0;
  border-right: none;
  border-bottom: none;
}
.top-right {
  top: 0;
  right: 0;
  border-left: none;
  border-bottom: none;
}
.bottom-left {
  bottom: 0;
  left: 0;
  border-right: none;
  border-top: none;
}
.bottom-right {
  bottom: 0;
  right: 0;
  border-left: none;
  border-top: none;
}
/* åŠ è½½å’Œé”™è¯¯çŠ¶æ€ */
.chart-loading-large,
.chart-error-large,
.chart-no-data-large {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100%;
  color: rgba(255, 255, 255, 0.6);
  font-size: 16px;
  gap: 10px;
}
.chart-loading-large i,
.chart-error-large i,
.chart-no-data-large i {
  font-size: 48px;
}
.chart-loading-large {
  color: #409eff;
}
.chart-error-large {
  color: #f56c6c;
}
/* å“åº”式设计 - ç§»é™¤åŽŸæœ‰çš„åª’ä½“æŸ¥è¯¢ï¼Œç”±JS动态缩放处理 */
</style>
ÏîÄ¿´úÂë/BigScreenVue/vue.config.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
const path = require('path')
const resolve = dir => {
  return path.join(__dirname, dir)
}
module.exports = {
  publicPath: './',
  devServer:{
    host:'0.0.0.0',
    port:8090
  },
  chainWebpack: config => {
    config.resolve.alias
      .set('_c', resolve('src/components')) // key,value自行定义,比如.set('@@', resolve('src/components'))
  },
  lintOnSave: false
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.backup.json
@@ -3,6 +3,18 @@
  "WorkspaceRootPath": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\agv\\agvsignal.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\agv\\agvsignal.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|solutionrelative:wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\agv\\commonagvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\agv\\commonagvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\stackercranejob\\commonstackercranejob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
@@ -17,22 +29,6 @@
    {
      "AbsoluteMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
      "RelativeMoniker": "D:0:0:{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}|WIDESEAWCS_Server\\WIDESEAWCS_Server.csproj|solutionrelative:wideseawcs_server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\agv\\commonagvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\agv\\commonagvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{83F18A31-5983-4587-A0B2-414BF70E50B5}|WIDESEAWCS_TaskInfoService\\WIDESEAWCS_TaskInfoService.csproj|solutionrelative:wideseawcs_taskinfoservice\\taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\agv\\agvsignal.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\agv\\agvsignal.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wcs\\wideseawcs_server\\wideseawcs_tasks\\elevatorjob\\commonelevatorjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\elevatorjob\\commonelevatorjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -42,11 +38,11 @@
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 4,
          "SelectedChildIndex": 6,
          "Children": [
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "DocumentIndex": 6,
              "Title": "appsettings.json",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\appsettings.json",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\appsettings.json",
@@ -54,12 +50,11 @@
              "RelativeToolTip": "WIDESEAWCS_Server\\appsettings.json",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvxsAAAAaAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
              "WhenOpened": "2025-11-13T02:26:06.738Z",
              "EditorCaption": ""
              "WhenOpened": "2025-11-13T02:26:06.738Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "DocumentIndex": 5,
              "Title": "Program.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Server\\Program.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Server\\Program.cs",
@@ -67,50 +62,37 @@
              "RelativeToolTip": "WIDESEAWCS_Server\\Program.cs",
              "ViewState": "AgIAAAMAAAAAAAAAAAAAABYAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-13T02:24:58.44Z",
              "EditorCaption": ""
              "WhenOpened": "2025-11-13T02:24:58.44Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 7,
              "Title": "CommonElevatorJob.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ElevatorJob\\CommonElevatorJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\ElevatorJob\\CommonElevatorJob.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ElevatorJob\\CommonElevatorJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\ElevatorJob\\CommonElevatorJob.cs",
              "ViewState": "AgIAACYAAAAAAAAAAAAAwGkAAAAQAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-10-09T12:12:52.995Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 5,
              "DocumentIndex": 1,
              "Title": "TaskService.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "RelativeToolTip": "WIDESEAWCS_TaskInfoService\\TaskService.cs",
              "ViewState": "AgIAAGkAAAAAAAAAAAAQwNMAAABbAAAAAAAAAA==",
              "ViewState": "AgIAABUCAAAAAAAAAAAYwCYCAAAhAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-09-25T03:21:17.498Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "DocumentIndex": 3,
              "Title": "CommonStackerCraneJob.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\StackerCraneJob\\CommonStackerCraneJob.cs",
              "ViewState": "AgIAAE0AAAAAAAAAAAAewIQAAAAIAAAAAAAAAA==",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAIQAAAAIAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-10-08T02:55:34.719Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "DocumentIndex": 4,
              "Title": "CommonConveyorLineJob.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
@@ -118,33 +100,33 @@
              "RelativeToolTip": "WIDESEAWCS_Tasks\\ConveyorLineJob\\CommonConveyorLineJob.cs",
              "ViewState": "AgIAAFsAAAAAAAAAAAAowIIAAABDAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-10-09T03:25:18.917Z",
              "EditorCaption": ""
              "WhenOpened": "2025-10-09T03:25:18.917Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "DocumentIndex": 2,
              "Title": "CommonAGVJob.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\AGV\\CommonAGVJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\AGV\\CommonAGVJob.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\AGV\\CommonAGVJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\AGV\\CommonAGVJob.cs",
              "ViewState": "AgIAABkAAAAAAAAAAAAAACIAAAB0AAAAAAAAAA==",
              "ViewState": "AgIAAB0AAAAAAAAAAAAwwDEAAAAoAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-10-09T05:11:29.775Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "DocumentIndex": 0,
              "Title": "AGVSignal.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\AGV\\AGVSignal.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\AGV\\AGVSignal.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Tasks\\AGV\\AGVSignal.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\AGV\\AGVSignal.cs",
              "ViewState": "AgIAAFIAAAAAAAAAAAAhwH0AAAAUAAAAAAAAAA==",
              "ViewState": "AgIAAGUAAAAAAAAAAAAYwG4AAABYAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-10-13T01:17:34.312Z"
              "WhenOpened": "2025-10-13T01:17:34.312Z",
              "EditorCaption": ""
            }
          ]
        }
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/DocumentLayout.json
@@ -62,7 +62,8 @@
              "RelativeToolTip": "WIDESEAWCS_Server\\Program.cs",
              "ViewState": "AgIAAAMAAAAAAAAAAAAAABYAAAAAAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-13T02:24:58.44Z"
              "WhenOpened": "2025-11-13T02:24:58.44Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSClient/src/views/Home.vue
@@ -1,48 +1,89 @@
<template>
  <div class="dashboard-container">
    <!-- æ•°æ®æ€»è§ˆéƒ¨åˆ† -->
    <div class="overview-section">
      <el-row :gutter="20">
        <el-col :lg="24">
          <div class="data-overview">
            <h3 class="title">数据总览</h3>
            <div class="metrics">
              <div class="metric-item" v-for="(item, index) in dataMetrics" :key="index">
                <div style="display: flex;align-items: center; margin-left: 80px;">
                  <div class="metric-icon">
            <div class="overview-header">
              <div class="header-left">
                <h3 class="title">
                  <i class="el-icon-data-analysis header-icon"></i>
                  æ•°æ®æ€»è§ˆ
                </h3>
              </div>
              <div class="header-right">
                <div class="time-range">数据更新于: {{ currentTime }}</div>
                <div>
                  <el-button type="primary" size="small" :icon="Refresh" @click="handleRefresh" :loading="refreshing"
                    class="refresh-btn">
                    åˆ·æ–°æ•°æ®
                  </el-button>
                </div>
              </div>
            </div>
            <div class="metrics-grid">
              <div class="metric-card" v-for="(item, index) in dataMetrics" :key="`metric-${index}-${refreshKey}`"
                :class="getMetricCardClass(item.name)">
                <div class="metric-content">
                  <div class="metric-icon-wrapper">
                    <i :class="getMetricIcon(item.name)"></i>
                  </div>
                  <div class="metric-info">
                  <div class="metric-name">{{ item.name }}</div>
                    <div class="metric-value">{{ formatNumber(item.value) }}</div>
                    <div class="metric-compare" v-if="item.compare !== undefined">
                      <span :class="getCompareClass(item.compare)">
                        <i :class="getCompareIcon(item.compare)"></i>
                        {{ formatCompareValue(item.compare) }}
                      </span>
                      <span class="compare-label">较昨日</span>
                </div>
                <div class="metric-value">{{ item.value }}</div>
                  </div>
                </div>
                <div class="metric-trend" v-if="item.compare !== undefined">
                  <div class="trend-chart">
                    <div class="trend-bar" :style="{ height: getTrendHeight(item) }"></div>
                  </div>
                </div>
                <div class="metric-decoration">
                  <div class="decoration-circle"></div>
                </div>
              </div>
            </div>
          </div>
        </el-col>
      </el-row>
    </div>
    <!-- ç”Ÿäº§ä»»åŠ¡çœ‹æ¿ -->
    <div class="overview-section">
      <el-row :gutter="20">
        <el-col :lg="24">
          <div class="bg-color-black task-board-container">
            <div class="d-flex pt-2 pl-2">
              <div class="d-flex">
                <span class="fs-xl text mx-2 title">当前生产任务</span>
          <div class="task-board-container">
            <div class="board-header">
              <div class="header-left">
                <i class="el-icon-s-management board-icon"></i>
                <span class="board-title">当前生产任务</span>
              </div>
              <div class="header-right">
                <span class="task-count">共 {{ tableData.length }} ä¸ªä»»åŠ¡</span>
              </div>
            </div>
            <div class="body-box">
            <div class="board-body">
              <div class="scroll-table-container" @mouseenter="pauseScroll" @mouseleave="resumeScroll">
                <!-- è¡¨å¤´ -->
                <div class="table-header" ref="tableHeader">
                  <table class="header-table">
                    <thead>
                      <tr>
                        <th style="width: 60px;font-size: 18px;">序号</th>
                        <th style="width: 100px;font-size: 18px;">托盘码</th>
                        <th style="width: 120px;font-size: 18px;">起始地址</th>
                        <th style="width: 120px;font-size: 18px;">目标地址</th>
                        <th style="width: 120px;font-size: 18px;">任务类型</th>
                        <th style="width: 120px;font-size: 18px;">任务状态</th>
                        <th style="width: 160px;font-size: 18px;">创建时间</th>
                        <th>序号</th>
                        <th>托盘码</th>
                        <th>起始地址</th>
                        <th>目标地址</th>
                        <th>任务类型</th>
                        <th>任务状态</th>
                        <th>创建时间</th>
                      </tr>
                    </thead>
                  </table>
@@ -54,21 +95,19 @@
                    <!-- åŽŸå§‹æ•°æ® -->
                    <table class="body-table">
                      <tbody>
                        <tr v-for="(row, index) in tableData" :key="index"
                        <tr v-for="(row, index) in tableData" :key="`task-${index}-${refreshKey}`"
                          :class="index % 2 === 0 ? 'even-row' : 'odd-row'">
                          <td style="width: 60px; text-align: center;font-size: 16px;">{{ index + 1 }}</td>
                          <td style="width: 100px; text-align: center;font-size: 16px;">{{ row.palletCode || '无' }}</td>
                          <td style="width: 120px; text-align: center;font-size: 16px;">{{ row.sourceAddress || '无' }}
                          </td>
                          <td style="width: 120px; text-align: center;font-size: 16px;">{{ row.targetAddress || '无' }}
                          </td>
                          <td style="width: 120px; text-align: center;font-size: 16px;">{{ row.taskType || '无' }}</td>
                          <td style="width: 120px; text-align: center;font-size: 16px;">
                            <el-tag :type="getStatusType(row.taskState)" size="small">
                          <td>{{ index + 1 }}</td>
                          <td>{{ row.palletCode || '无' }}</td>
                          <td>{{ row.sourceAddress || '无' }}</td>
                          <td>{{ row.targetAddress || '无' }}</td>
                          <td>{{ row.taskType || '无' }}</td>
                          <td>
                            <el-tag :type="getStatusType(row.taskState)" size="small" class="status-tag">
                              {{ row.taskState || '无' }}
                            </el-tag>
                          </td>
                          <td style="width: 160px; text-align: center;font-size: 18px;">{{ row.createDate || '无' }}</td>
                          <td>{{ formatDateTime(row.createDate) || '无' }}</td>
                        </tr>
                      </tbody>
                    </table>
@@ -76,19 +115,19 @@
                    <!-- å¤åˆ¶ä¸€ä»½æ•°æ®ç”¨äºŽæ— ç¼æ»šåЍ -->
                    <table class="body-table" v-if="tableData.length > rowNum">
                      <tbody>
                        <tr v-for="(row, index) in tableData" :key="`copy-${index}`"
                        <tr v-for="(row, index) in tableData" :key="`task-copy-${index}-${refreshKey}`"
                          :class="index % 2 === 0 ? 'even-row' : 'odd-row'">
                          <td style="width: 60px; text-align: center;">{{ index + tableData.length + 1 }}</td>
                          <td style="width: 100px; text-align: center;">{{ row.palletCode || '无' }}</td>
                          <td style="width: 120px; text-align: center;">{{ row.sourceAddress || '无' }}</td>
                          <td style="width: 120px; text-align: center;">{{ row.targetAddress || '无' }}</td>
                          <td style="width: 120px; text-align: center;">{{ row.taskType || '无' }}</td>
                          <td style="width: 120px; text-align: center;">
                            <el-tag :type="getStatusType(row.taskState)" size="small">
                          <td>{{ index + tableData.length + 1 }}</td>
                          <td>{{ row.palletCode || '无' }}</td>
                          <td>{{ row.sourceAddress || '无' }}</td>
                          <td>{{ row.targetAddress || '无' }}</td>
                          <td>{{ row.taskType || '无' }}</td>
                          <td>
                            <el-tag :type="getStatusType(row.taskState)" size="small" class="status-tag">
                              {{ row.taskState || '无' }}
                            </el-tag>
                          </td>
                          <td style="width: 160px; text-align: center;">{{ row.createDate || '无' }}</td>
                          <td>{{ formatDateTime(row.createDate) || '无' }}</td>
                        </tr>
                      </tbody>
                    </table>
@@ -103,39 +142,96 @@
        </el-col>
      </el-row>
    </div>
    <!-- å›¾è¡¨éƒ¨åˆ† -->
    <div class="charts-section">
      <el-row :gutter="20">
        <el-col :lg="12">
          <div class="chart-container">
            <h3 class="title">出库量</h3>
            <div v-if="loading" class="loading">加载中...</div>
            <div v-else-if="error" class="error">数据加载失败</div>
            <div v-else-if="!chartData.outbound.values.length" class="no-data">暂无出库数据</div>
            <div v-else ref="outboundChart" class="chart"></div>
          <div class="chart-card">
            <div class="chart-header">
              <h3 class="chart-title">
                <i class="el-icon-trend-charts chart-icon"></i>
                å‡ºåº“量趋势
              </h3>
              <div class="chart-subtitle">近7日出库统计</div>
            </div>
            <div class="chart-content">
              <div v-if="loading" class="chart-loading">
                <i class="el-icon-loading"></i>
                <span>数据加载中...</span>
              </div>
              <div v-else-if="error" class="chart-error">
                <i class="el-icon-warning"></i>
                <span>数据加载失败</span>
                <el-button type="text" @click="fetchData" class="retry-btn">重试</el-button>
              </div>
              <div v-else-if="!chartData.outbound.values.length" class="chart-no-data">
                <i class="el-icon-data-line"></i>
                <span>暂无出库数据</span>
              </div>
              <div v-else ref="outboundChart" class="chart" :key="`outbound-${refreshKey}`"></div>
            </div>
          </div>
        </el-col>
        <el-col :lg="12">
          <div class="chart-container">
            <h3 class="title">入库量</h3>
            <div v-if="loading" class="loading">加载中...</div>
            <div v-else-if="error" class="error">数据加载失败</div>
            <div v-else-if="!chartData.inbound.values.length" class="no-data">暂无入库数据</div>
            <div v-else ref="inboundChart" class="chart"></div>
          <div class="chart-card">
            <div class="chart-header">
              <h3 class="chart-title">
                <i class="el-icon-trend-charts chart-icon"></i>
                å…¥åº“量趋势
              </h3>
              <div class="chart-subtitle">近7日入库统计</div>
            </div>
            <div class="chart-content">
              <div v-if="loading" class="chart-loading">
                <i class="el-icon-loading"></i>
                <span>数据加载中...</span>
              </div>
              <div v-else-if="error" class="chart-error">
                <i class="el-icon-warning"></i>
                <span>数据加载失败</span>
                <el-button type="text" @click="fetchData" class="retry-btn">重试</el-button>
              </div>
              <div v-else-if="!chartData.inbound.values.length" class="chart-no-data">
                <i class="el-icon-data-line"></i>
                <span>暂无入库数据</span>
              </div>
              <div v-else ref="inboundChart" class="chart" :key="`inbound-${refreshKey}`"></div>
            </div>
          </div>
        </el-col>
      </el-row>
    </div>
    <div style="margin-top: 20px;"></div>
    <!-- æœˆåº¦æ•°æ®å›¾è¡¨ -->
    <div class="charts-section">
      <el-row :gutter="20">
        <el-col :lg="24">
          <div class="chart-container">
            <h3 class="title">月出入库量</h3>
            <div v-if="loading" class="loading">加载中...</div>
            <div v-else-if="error" class="error">数据加载失败</div>
            <div v-else-if="!chartData.monthData.inValue.length || !chartData.monthData.outValue.length" class="no-data">
              æš‚无出入库数据</div>
            <div v-else ref="monthDataChart" class="chart1"></div>
          <div class="chart-card">
            <div class="chart-header">
              <h3 class="chart-title">
                <i class="el-icon-data-line chart-icon"></i>
                æœˆåº¦å‡ºå…¥åº“对比
              </h3>
              <div class="chart-subtitle">本月每日出入库量统计</div>
            </div>
            <div class="chart-content">
              <div v-if="loading" class="chart-loading">
                <i class="el-icon-loading"></i>
                <span>数据加载中...</span>
              </div>
              <div v-else-if="error" class="chart-error">
                <i class="el-icon-warning"></i>
                <span>数据加载失败</span>
                <el-button type="text" @click="fetchData" class="retry-btn">重试</el-button>
              </div>
              <div v-else-if="!chartData.monthData.inValue.length || !chartData.monthData.outValue.length"
                class="chart-no-data">
                <i class="el-icon-data-line"></i>
                <span>暂无出入库数据</span>
              </div>
              <div v-else ref="monthDataChart" class="chart-large" :key="`month-${refreshKey}`"></div>
            </div>
          </div>
        </el-col>
      </el-row>
@@ -145,9 +241,9 @@
<script setup>
import http from '../api/http.js';
import { ref, reactive, onMounted, onUnmounted, nextTick, computed } from 'vue';
import { ref, reactive, onMounted, onUnmounted, nextTick } from 'vue';
import * as echarts from 'echarts';
// import { TrendCharts } from '@element-plus/icons-vue';
import { Refresh } from '@element-plus/icons-vue';
// å“åº”式数据
const dataMetrics = ref([]);
@@ -159,6 +255,8 @@
});
const loading = ref(true);
const error = ref(false);
const refreshing = ref(false);
const refreshKey = ref(0); // ç”¨äºŽå¼ºåˆ¶é‡æ–°æ¸²æŸ“
// æ»šåŠ¨ç›¸å…³
const tableHeader = ref(null);
@@ -167,19 +265,11 @@
const isScrolling = ref(true);
let scrollInterval = null;
const rowNum = 7; // æ˜¾ç¤ºçš„行数
const rowHeight = 40; // æ¯è¡Œé«˜åº¦
const rowHeight = 48; // æ¯è¡Œé«˜åº¦
// å½“前时间
const currentTime = ref('');
const getMetricIcon = (type) => {
  const iconMap = {
    '今日进库量': 'iconfont icon-cangpeitubiao_huanhuorukutuihuoruku',
    '今日出库量': 'el-icon-takeaway-box',
    '本月进库量': 'iconfont icon-cangpeitubiao_huanhuorukutuihuoruku',
    '本月出库量': 'el-icon-takeaway-box',
    '库存总量': 'el-icon-goods',
  };
  return iconMap[type] || 'el-icon-data-board';
};
// å›¾è¡¨å¼•用和实例
const outboundChart = ref(null);
const inboundChart = ref(null);
@@ -188,6 +278,107 @@
const inboundInstance = ref(null);
const monthDataInstance = ref(null);
const charts = ref([]);
// æ ¼å¼åŒ–æ•°å­—
const formatNumber = (num) => {
  if (num === undefined || num === null) return '0';
  return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
};
// æ ¼å¼åŒ–比较值
const formatCompareValue = (value) => {
  if (value === 0) return '0';
  return value > 0 ? `+${formatNumber(value)}` : formatNumber(value);
};
// æ ¼å¼åŒ–日期时间
const formatDateTime = (dateString) => {
  if (!dateString) return '';
  try {
    const date = new Date(dateString);
    return date.toLocaleString('zh-CN', {
      month: '2-digit',
      day: '2-digit',
      hour: '2-digit',
      minute: '2-digit'
    });
  } catch {
    return dateString;
  }
};
// èŽ·å–æ¯”è¾ƒå€¼æ ·å¼ç±»
const getCompareClass = (compare) => {
  if (compare > 0) return 'compare-positive';
  if (compare < 0) return 'compare-negative';
  return 'compare-zero';
};
// èŽ·å–æ¯”è¾ƒå€¼å›¾æ ‡
const getCompareIcon = (compare) => {
  if (compare > 0) return 'el-icon-top';
  if (compare < 0) return 'el-icon-bottom';
  return 'el-icon-minus';
};
// èŽ·å–è¶‹åŠ¿é«˜åº¦
const getTrendHeight = (item) => {
  if (item.compare === undefined || item.value === 0) return '0%';
  const maxValue = Math.max(Math.abs(item.value), Math.abs(item.compare));
  if (maxValue === 0) return '0%';
  const percentage = (Math.abs(item.compare) / maxValue) * 100;
  return `${Math.min(percentage, 100)}%`;
};
// èŽ·å–æŒ‡æ ‡å¡ç‰‡æ ·å¼ç±»
const getMetricCardClass = (name) => {
  const classMap = {
    '今日进库量': 'metric-inbound-today',
    '今日出库量': 'metric-outbound-today',
    '本月进库量': 'metric-inbound-month',
    '本月出库量': 'metric-outbound-month',
    '库存总量': 'metric-total'
  };
  return classMap[name] || '';
};
const getMetricIcon = (type) => {
  const iconMap = {
    '今日进库量': 'el-icon-download',
    '今日出库量': 'el-icon-upload2',
    '本月进库量': 'el-icon-download',
    '本月出库量': 'el-icon-upload2',
    '库存总量': 'el-icon-box',
  };
  return iconMap[type] || 'el-icon-data-board';
};
// çŠ¶æ€æ ‡ç­¾ç±»åž‹
const getStatusType = (status) => {
  const statusMap = {
    '进行中': 'primary',
    '已完成': 'success',
    '已取消': 'info',
    '异常': 'danger',
    '待执行': 'warning'
  };
  return statusMap[status] || 'primary';
};
// æ›´æ–°å½“前时间
const updateCurrentTime = () => {
  const now = new Date();
  currentTime.value = now.toLocaleString('zh-CN', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit'
  });
};
// å¯åŠ¨æ»šåŠ¨
const startScrolling = () => {
@@ -206,7 +397,7 @@
    if (scrollPosition.value >= totalHeight) {
      scrollPosition.value = 0;
    }
  }, 20); // è°ƒæ•´æ»šåŠ¨é€Ÿåº¦
  }, 30); // è°ƒæ•´æ»šåŠ¨é€Ÿåº¦
};
// æš‚停滚动
@@ -225,15 +416,19 @@
  }
};
// çŠ¶æ€æ ‡ç­¾ç±»åž‹
const getStatusType = (status) => {
  const statusMap = {
  };
  return statusMap[status] || 'primary';
};
// åˆå§‹åŒ–图表
const initCharts = () => {
  // æ¸…理旧的图表实例
  if (outboundInstance.value) {
    outboundInstance.value.dispose();
  }
  if (inboundInstance.value) {
    inboundInstance.value.dispose();
  }
  if (monthDataInstance.value) {
    monthDataInstance.value.dispose();
  }
  if (!outboundChart.value || !inboundChart.value || !monthDataChart.value) {
    console.log('图表容器未找到,延迟初始化');
    return;
@@ -255,44 +450,76 @@
      formatter: function (params) {
        const data = params[0];
        return `
          <div style="font-weight: bold; margin-bottom: 5px;">${data.name}</div>
          <div style="display: flex; align-items: center;">
            <span style="display: inline-block; width: 10px; height: 10px; background: ${data.color}; border-radius: 50%; margin-right: 5px;"></span>
            <span>${data.seriesName}: </span>
            <span style="font-weight: bold; margin-left: 5px;">${data.value}</span>
          <div style="font-weight: 600; margin-bottom: 8px; color: #303133;">${data.name}</div>
          <div style="display: flex; align-items: center; font-size: 14px;">
            <span style="display: inline-block; width: 8px; height: 8px; background: ${data.color}; border-radius: 50%; margin-right: 8px;"></span>
            <span style="color: #606266;">${data.seriesName}: </span>
            <span style="font-weight: 600; margin-left: 8px; color: #303133;">${data.value}</span>
          </div>
        `;
      },
      backgroundColor: 'rgba(255, 255, 255, 0.9)',
      borderColor: '#ddd',
      backgroundColor: 'rgba(255, 255, 255, 0.95)',
      borderColor: '#e4e7ed',
      borderWidth: 1,
      textStyle: {
        color: '#333'
      }
        color: '#303133'
      },
      padding: [8, 12],
      borderRadius: 6,
      shadowColor: 'rgba(0, 0, 0, 0.1)',
      shadowBlur: 8
    },
    grid: {
      left: '3%',
      right: '4%',
      right: '3%',
      bottom: '3%',
      top: '15%',
      containLabel: true
    },
    xAxis: {
      type: 'category',
      data: chartData.outbound.dates,
      axisLine: {
        lineStyle: {
          color: '#e4e7ed'
        }
      },
      axisLabel: {
        color: '#606266',
        rotate: 45
      }
    },
    yAxis: {
      type: 'value',
      name: '数量'
      name: '数量',
      nameTextStyle: {
        color: '#909399'
      },
      axisLine: {
        lineStyle: {
          color: '#e4e7ed'
        }
      },
      axisLabel: {
        color: '#606266'
      },
      splitLine: {
        lineStyle: {
          color: '#f0f2f5',
          type: 'dashed'
        }
      }
    },
    series: [{
      name: '出库量',
      data: chartData.outbound.values,
      type: 'bar',
      itemStyle: {
        color: '#e06e6e'
        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
          { offset: 0, color: '#ff9f7f' },
          { offset: 1, color: '#ff6b6b' }
        ]),
        borderRadius: [4, 4, 0, 0]
      },
      barWidth: '60%',
      animation: true,
@@ -300,7 +527,8 @@
        show: true,
        position: 'top',
        formatter: '{c}',
        color: '#e06e6e'
        color: '#ff6b6b',
        fontWeight: 'bold'
      }
    }]
  };
@@ -315,55 +543,98 @@
      formatter: function (params) {
        const data = params[0];
        return `
          <div style="font-weight: bold; margin-bottom: 5px;">${data.name}</div>
          <div style="display: flex; align-items: center;">
            <span style="display: inline-block; width: 10px; height: 10px; background: ${data.color}; border-radius: 50%; margin-right: 5px;"></span>
            <span>${data.seriesName}: </span>
            <span style="font-weight: bold; margin-left: 5px;">${data.value}</span>
          <div style="font-weight: 600; margin-bottom: 8px; color: #303133;">${data.name}</div>
          <div style="display: flex; align-items: center; font-size: 14px;">
            <span style="display: inline-block; width: 8px; height: 8px; background: ${data.color}; border-radius: 50%; margin-right: 8px;"></span>
            <span style="color: #606266;">${data.seriesName}: </span>
            <span style="font-weight: 600; margin-left: 8px; color: #303133;">${data.value}</span>
          </div>
        `;
      },
      backgroundColor: 'rgba(255, 255, 255, 0.9)',
      borderColor: '#ddd',
      backgroundColor: 'rgba(255, 255, 255, 0.95)',
      borderColor: '#e4e7ed',
      borderWidth: 1,
      textStyle: {
        color: '#333'
      }
        color: '#303133'
      },
      padding: [8, 12],
      borderRadius: 6,
      shadowColor: 'rgba(0, 0, 0, 0.1)',
      shadowBlur: 8
    },
    grid: {
      left: '3%',
      right: '4%',
      right: '3%',
      bottom: '3%',
      top: '15%',
      containLabel: true
    },
    xAxis: {
      type: 'category',
      data: chartData.inbound.dates,
      axisLine: {
        lineStyle: {
          color: '#e4e7ed'
        }
      },
      axisLabel: {
        color: '#606266',
        rotate: 45
      }
    },
    yAxis: {
      type: 'value',
      name: '数量'
      name: '数量',
      nameTextStyle: {
        color: '#909399'
      },
      axisLine: {
        lineStyle: {
          color: '#e4e7ed'
        }
      },
      axisLabel: {
        color: '#606266'
      },
      splitLine: {
        lineStyle: {
          color: '#f0f2f5',
          type: 'dashed'
        }
      }
    },
    series: [{
      name: '入库量',
      data: chartData.inbound.values,
      type: 'line',
      smooth: true,
      symbol: 'circle',
      symbolSize: 8,
      itemStyle: {
        color: '#4a7bff'
        color: '#409eff',
        borderColor: '#fff',
        borderWidth: 2
      },
      lineStyle: {
        width: 3
        width: 3,
        color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
          { offset: 0, color: '#409eff' },
          { offset: 1, color: '#67c23a' }
        ])
      },
      smooth: true,
      areaStyle: {
        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
          { offset: 0, color: 'rgba(64, 158, 255, 0.3)' },
          { offset: 1, color: 'rgba(64, 158, 255, 0.1)' }
        ])
      },
      animation: true,
      label: {
        show: true,
        position: 'top',
        formatter: '{c}',
        color: '#4a7bff'
        color: '#409eff',
        fontWeight: 'bold'
      }
    }]
  };
@@ -379,39 +650,55 @@
        }
      },
      formatter: function (params) {
        let html = `<div style="font-weight: bold; margin-bottom: 5px;">${params[0].name}</div>`;
        let html = `<div style="font-weight: 600; margin-bottom: 8px; color: #303133;">${params[0].name}</div>`;
        params.forEach(param => {
          html += `
            <div style="display: flex; align-items: center; margin: 2px 0;">
              <span style="display: inline-block; width: 10px; height: 10px; background: ${param.color}; border-radius: 50%; margin-right: 5px;"></span>
              <span>${param.seriesName}: </span>
              <span style="font-weight: bold; margin-left: 5px;">${param.value}</span>
            <div style="display: flex; align-items: center; margin: 4px 0; font-size: 14px;">
              <span style="display: inline-block; width: 8px; height: 8px; background: ${param.color}; border-radius: 50%; margin-right: 8px;"></span>
              <span style="color: #606266;">${param.seriesName}: </span>
              <span style="font-weight: 600; margin-left: 8px; color: #303133;">${param.value}</span>
            </div>
          `;
        });
        return html;
      },
      backgroundColor: 'rgba(255, 255, 255, 0.9)',
      borderColor: '#ddd',
      backgroundColor: 'rgba(255, 255, 255, 0.95)',
      borderColor: '#e4e7ed',
      borderWidth: 1,
      textStyle: {
        color: '#333'
      }
        color: '#303133'
      },
      padding: [12, 16],
      borderRadius: 6,
      shadowColor: 'rgba(0, 0, 0, 0.1)',
      shadowBlur: 8
    },
    legend: {
      data: ['入库量', '出库量'],
      bottom: 0
      bottom: 10,
      textStyle: {
        color: '#606266'
      },
      itemWidth: 12,
      itemHeight: 12
    },
    grid: {
      left: '3%',
      right: '4%',
      bottom: '10%',
      right: '3%',
      bottom: '12%',
      top: '15%',
      containLabel: true
    },
    xAxis: {
      type: 'category',
      data: chartData.monthData.dates,
      axisLine: {
        lineStyle: {
          color: '#e4e7ed'
        }
      },
      axisLabel: {
        color: '#606266',
        rotate: 45
      },
      axisPointer: {
@@ -420,45 +707,68 @@
    },
    yAxis: {
      type: 'value',
      name: '数量'
      name: '数量',
      nameTextStyle: {
        color: '#909399'
      },
      axisLine: {
        lineStyle: {
          color: '#e4e7ed'
        }
      },
      axisLabel: {
        color: '#606266'
      },
      splitLine: {
        lineStyle: {
          color: '#f0f2f5',
          type: 'dashed'
        }
      }
    },
    series: [
      {
        name: '入库量',
        data: chartData.monthData.inValue,
        type: 'line',
        smooth: true,
        symbol: 'circle',
        symbolSize: 6,
        itemStyle: {
          color: '#4a7bff'
          color: '#409eff'
        },
        lineStyle: {
          width: 3
        },
        smooth: true,
        animation: true,
        label: {
          show: true,
          position: 'top',
          formatter: '{c}',
          color: '#4a7bff'
          color: '#409eff',
          fontWeight: 'bold'
        }
      },
      {
        name: '出库量',
        data: chartData.monthData.outValue,
        type: 'line',
        smooth: true,
        symbol: 'circle',
        symbolSize: 6,
        itemStyle: {
          color: '#e06e6e'
          color: '#ff6b6b'
        },
        lineStyle: {
          width: 3
        },
        smooth: true,
        animation: true,
        label: {
          show: true,
          position: 'top',
          formatter: '{c}',
          color: '#e06e6e'
          color: '#ff6b6b',
          fontWeight: 'bold'
        }
      }
    ]
@@ -472,29 +782,19 @@
// æ›´æ–°å›¾è¡¨æ•°æ®
const updateCharts = () => {
  nextTick(() => {
    if (outboundInstance.value && chartData.outbound.values.length > 0) {
      outboundInstance.value.setOption({
        xAxis: { data: chartData.outbound.dates },
        series: [{ data: chartData.outbound.values }]
      });
    // å…ˆé”€æ¯æ—§çš„图表实例
    if (outboundInstance.value) {
      outboundInstance.value.dispose();
    }
    if (inboundInstance.value) {
      inboundInstance.value.dispose();
    }
    if (monthDataInstance.value) {
      monthDataInstance.value.dispose();
    }
    if (inboundInstance.value && chartData.inbound.values.length > 0) {
      inboundInstance.value.setOption({
        xAxis: { data: chartData.inbound.dates },
        series: [{ data: chartData.inbound.values }]
      });
    }
    if (monthDataInstance.value && chartData.monthData.dates.length > 0) {
      monthDataInstance.value.setOption({
        xAxis: { data: chartData.monthData.dates },
        series: [
          { data: chartData.monthData.inValue },
          { data: chartData.monthData.outValue }
        ]
      });
    }
    // é‡æ–°åˆå§‹åŒ–图表
    initCharts();
  });
};
@@ -507,11 +807,12 @@
const handleDataUpdate = (data) => {
  console.log('API响应数据:', data);
  // æ›´æ–°æ•°æ®æŒ‡æ ‡
  // ä½¿ç”¨ Object.assign ç¡®ä¿å“åº”式更新
  if (data.metrics && Array.isArray(data.metrics)) {
    dataMetrics.value = data.metrics.map(item => ({
      name: item.name || item.Name || '未知指标',
      value: item.value != null ? item.value : item.Value || 0
      value: item.value != null ? item.value : item.Value || 0,
      compare: item.compare != null ? item.compare : 0
    }));
  }
@@ -555,13 +856,12 @@
    pauseScroll();
  }
  // å¼ºåˆ¶æ›´æ–° refreshKey è§¦å‘重新渲染
  refreshKey.value++;
  // å»¶è¿Ÿåˆå§‹åŒ–图表,确保数据已更新
  nextTick(() => {
    if (!outboundInstance.value || !inboundInstance.value || !monthDataInstance.value) {
      initCharts();
    } else {
      updateCharts();
    }
  });
};
@@ -570,26 +870,42 @@
  try {
    loading.value = true;
    error.value = false;
    refreshing.value = true;
    const response = await http.post("api/StockInfo/GetStockData", {});
    console.log('API响应:', response);
    if (response.data && response.data.success !== false) {
      handleDataUpdate(response.data);
      error.value = false;
    } else {
      throw new Error('API返回数据格式错误');
    }
    loading.value = false;
  } catch (err) {
    console.error('API请求失败:', err);
    loading.value = false;
    error.value = true;
  } finally {
    loading.value = false;
    refreshing.value = false;
    updateCurrentTime();
  }
};
// åˆ·æ–°å¤„理
const handleRefresh = () => {
  fetchData();
};
const intervalId = ref(null);
const timeIntervalId = ref(null);
const startPolling = () => {
  fetchData();
  // è®¾ç½®å®šæ—¶æ›´æ–°å½“前时间
  timeIntervalId.value = setInterval(updateCurrentTime, 1000);
  // è®¾ç½®å®šæ—¶èŽ·å–æ•°æ®
  intervalId.value = setInterval(fetchData, 5 * 60 * 1000); // 5分钟轮询
};
@@ -597,6 +913,10 @@
  if (intervalId.value) {
    clearInterval(intervalId.value);
    intervalId.value = null;
  }
  if (timeIntervalId.value) {
    clearInterval(timeIntervalId.value);
    timeIntervalId.value = null;
  }
  pauseScroll();
};
@@ -614,105 +934,406 @@
});
</script>
<style scoped lang="less">
<style scoped>
.retry-btn {
  margin-left: 8px;
  color: #409eff;
}
.chart-error {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 12px;
}
.chart-error .el-button {
  margin-top: 8px;
}
.dashboard-container {
  padding: 20px;
  background-color: #f5f6fa;
  background: linear-gradient(135deg, #f5f7fa 0%, #e4e7ed 100%);
  min-height: 100vh;
  font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif;
}
.overview-section {
  margin-bottom: 20px;
  margin-bottom: 24px;
}
.data-overview {
  background: white;
  padding: 16px;
  border-radius: 8px;
  height: 200px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);
  padding: 24px;
  border-radius: 16px;
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
  border: 1px solid rgba(255, 255, 255, 0.8);
  backdrop-filter: blur(10px);
}
  .title {
.overview-header {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  margin-bottom: 24px;
}
.header-left .title {
    display: flex;
    align-items: center;
    &::before {
      display: block;
      content: "";
      width: 6px;
      height: 20px;
      background-color: #409eff;
      margin-right: 10px;
    }
  }
  margin: 0 0 8px 0;
  font-size: 20px;
  font-weight: 700;
  color: #303133;
  line-height: 1.2;
}
.task-board-container {
  height: 300px;
  border-radius: 8px;
  background-color: white;
.header-icon {
  margin-right: 12px;
  font-size: 24px;
  color: #409eff;
  background: linear-gradient(135deg, #409eff, #79bbff);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}
.subtitle {
  font-size: 14px;
  color: #909399;
  margin: 0;
}
.header-right {
  display: flex;
  flex-direction: column;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  align-items: flex-end;
  gap: 12px;
}
.d-flex {
  display: flex;
.time-range {
  font-size: 13px;
  color: #909399;
  background: rgba(64, 158, 255, 0.1);
  padding: 6px 12px;
  border-radius: 20px;
  border: 1px solid rgba(64, 158, 255, 0.2);
}
  .title {
.refresh-btn {
  border-radius: 20px;
  padding: 8px 16px;
  font-weight: 500;
  box-shadow: 0 2px 8px rgba(64, 158, 255, 0.3);
  transition: all 0.3s ease;
}
.refresh-btn:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 12px rgba(64, 158, 255, 0.4);
}
.metrics-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 20px;
}
.metric-card {
  background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);
  border-radius: 12px;
  padding: 24px;
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
  border: 1px solid rgba(255, 255, 255, 0.8);
  transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
    display: flex;
  justify-content: space-between;
    align-items: center;
    &::before {
      display: block;
      content: "";
      width: 6px;
      height: 20px;
      background-color: #409eff;
      margin-right: 10px;
    }
  }
}
.pt-2 {
  padding-top: 0.5rem;
}
.pl-2 {
  padding-left: 0.5rem;
}
.text-icon {
  color: #409eff;
  font-size: 18px;
}
.fs-xl {
  font-size: 16px;
  font-weight: bold;
}
.text {
  color: #333;
}
.mx-2 {
  margin-left: 0.5rem;
  margin-right: 0.5rem;
}
.body-box {
  flex: 1;
  padding: 10px;
  border-radius: 8px;
  position: relative;
  overflow: hidden;
}
.scroll-table-container {
  height: 250px;
.metric-card:hover {
  transform: translateY(-6px);
  box-shadow: 0 8px 25px rgba(0, 0, 0, 0.12);
}
.metric-card::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 3px;
  background: linear-gradient(90deg, transparent 0%, currentColor 50%, transparent 100%);
  opacity: 0;
  transition: opacity 0.3s ease;
}
.metric-card:hover::before {
  opacity: 1;
}
.metric-inbound-today {
  border-left: 4px solid #67c23a;
  color: #67c23a;
}
.metric-outbound-today {
  border-left: 4px solid #e6a23c;
  color: #e6a23c;
}
.metric-inbound-month {
  border-left: 4px solid #409eff;
  color: #409eff;
}
.metric-outbound-month {
  border-left: 4px solid #f56c6c;
  color: #f56c6c;
}
.metric-total {
  border-left: 4px solid #909399;
  color: #909399;
}
.metric-content {
  display: flex;
  align-items: flex-start;
  flex: 1;
  z-index: 2;
}
.metric-icon-wrapper {
  width: 56px;
  height: 56px;
  border-radius: 12px;
  display: flex;
  align-items: center;
  justify-content: center;
  margin-right: 16px;
  font-size: 28px;
  transition: all 0.3s ease;
}
.metric-card:hover .metric-icon-wrapper {
  transform: scale(1.1);
}
.metric-inbound-today .metric-icon-wrapper {
  background: linear-gradient(135deg, rgba(103, 194, 58, 0.15), rgba(103, 194, 58, 0.05));
  color: #67c23a;
}
.metric-outbound-today .metric-icon-wrapper {
  background: linear-gradient(135deg, rgba(230, 162, 60, 0.15), rgba(230, 162, 60, 0.05));
  color: #e6a23c;
}
.metric-inbound-month .metric-icon-wrapper {
  background: linear-gradient(135deg, rgba(64, 158, 255, 0.15), rgba(64, 158, 255, 0.05));
  color: #409eff;
}
.metric-outbound-month .metric-icon-wrapper {
  background: linear-gradient(135deg, rgba(245, 108, 108, 0.15), rgba(245, 108, 108, 0.05));
  color: #f56c6c;
}
.metric-total .metric-icon-wrapper {
  background: linear-gradient(135deg, rgba(144, 147, 153, 0.15), rgba(144, 147, 153, 0.05));
  color: #909399;
}
.metric-info {
  flex: 1;
}
.metric-name {
  font-size: 14px;
  color: #606266;
  margin-bottom: 8px;
  font-weight: 500;
}
.metric-value {
  font-size: 28px;
  font-weight: 800;
  color: #303133;
  margin-bottom: 8px;
  line-height: 1;
  background: linear-gradient(135deg, currentColor, #303133);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}
.metric-compare {
  display: flex;
  align-items: center;
  font-size: 12px;
}
.compare-positive {
  color: #f56c6c;
  font-weight: 600;
  display: flex;
  align-items: center;
  margin-right: 8px;
}
.compare-positive i {
  font-size: 12px;
  margin-right: 4px;
}
.compare-negative {
  color: #67c23a;
  font-weight: 600;
  display: flex;
  align-items: center;
  margin-right: 8px;
}
.compare-negative i {
  font-size: 12px;
  margin-right: 4px;
}
.compare-zero {
  color: #909399;
  font-weight: 600;
  display: flex;
  align-items: center;
  margin-right: 8px;
}
.compare-zero i {
  font-size: 12px;
  margin-right: 4px;
}
.compare-label {
  color: #909399;
  font-size: 11px;
}
.metric-trend {
  width: 44px;
  height: 44px;
  display: flex;
  align-items: flex-end;
  justify-content: center;
  z-index: 2;
}
.trend-chart {
  width: 6px;
  height: 100%;
  background: rgba(0, 0, 0, 0.06);
  border-radius: 3px;
  position: relative;
  border: 1px solid #e0e0e0;
  border-radius: 4px;
  overflow: hidden;
}
.trend-bar {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  border-radius: 3px;
  transition: height 0.8s cubic-bezier(0.4, 0, 0.2, 1);
}
.metric-inbound-today .trend-bar {
  background: linear-gradient(to top, #67c23a, #95d475);
}
.metric-outbound-today .trend-bar {
  background: linear-gradient(to top, #e6a23c, #eebe77);
}
.metric-inbound-month .trend-bar {
  background: linear-gradient(to top, #409eff, #79bbff);
}
.metric-outbound-month .trend-bar {
  background: linear-gradient(to top, #f56c6c, #f89898);
}
.metric-total .trend-bar {
  background: linear-gradient(to top, #909399, #b1b3b8);
}
.metric-decoration {
  position: absolute;
  top: -20px;
  right: -20px;
  width: 80px;
  height: 80px;
  opacity: 0.1;
  z-index: 1;
}
.decoration-circle {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  background: currentColor;
}
/* ä»»åŠ¡çœ‹æ¿æ ·å¼ */
.task-board-container {
  background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);
  border-radius: 16px;
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
  border: 1px solid rgba(255, 255, 255, 0.8);
  overflow: hidden;
}
.board-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 20px 24px;
  background: linear-gradient(135deg, #409eff 0%, #79bbff 100%);
  color: white;
}
.header-left {
  display: flex;
  align-items: center;
}
.board-icon {
  font-size: 20px;
  margin-right: 12px;
}
.board-title {
  font-size: 18px;
  font-weight: 600;
}
.task-count {
  font-size: 14px;
  opacity: 0.9;
  background: rgba(255, 255, 255, 0.2);
  padding: 4px 12px;
  border-radius: 12px;
}
.board-body {
  height: 320px;
  padding: 0;
}
.scroll-table-container {
  height: 100%;
  position: relative;
  overflow: hidden;
}
@@ -721,8 +1342,9 @@
  top: 0;
  left: 0;
  right: 0;
  z-index: 10;
  background: #0066cc;
  z-index: 20;
  background: #f8f9fa;
  border-bottom: 2px solid #e4e7ed;
}
.header-table {
@@ -731,23 +1353,33 @@
}
.header-table th {
  background: #0066cc;
  color: white;
  font-weight: bold;
  padding: 8px 4px;
  background: #f8f9fa;
  color: #606266;
  font-weight: 600;
  padding: 16px 12px;
  text-align: center;
  border-right: 1px solid #0055aa;
  font-size: 12px;
  border-right: 1px solid #e4e7ed;
  font-size: 14px;
  position: relative;
}
.header-table th:last-child {
  border-right: none;
}
.header-table th::after {
  content: '';
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  height: 2px;
  background: linear-gradient(90deg, #409eff, #79bbff);
}
.table-body-container {
  position: absolute;
  top: 40px;
  /* è¡¨å¤´é«˜åº¦ */
  top: 56px;
  left: 0;
  right: 0;
  bottom: 0;
@@ -755,7 +1387,7 @@
}
.table-body-wrapper {
  transition: transform 0.1s linear;
  transition: transform 0.3s ease;
}
.body-table {
@@ -764,15 +1396,17 @@
}
.body-table td {
  padding: 8px 4px;
  border-bottom: 1px solid #f0f0f0;
  font-size: 12px;
  height: 40px;
  padding: 14px 12px;
  border-bottom: 1px solid #f0f2f5;
  font-size: 13px;
  height: 48px;
  box-sizing: border-box;
  text-align: center;
  color: #606266;
}
.even-row {
  background-color: #f8f9fa;
  background-color: #fafbfc;
}
.odd-row {
@@ -780,7 +1414,16 @@
}
.body-table tr:hover {
  background-color: #e6f7ff !important;
  background-color: #f0f7ff !important;
  transform: scale(1.01);
  transition: all 0.2s ease;
}
.status-tag {
  border-radius: 12px;
  padding: 4px 12px;
  font-weight: 500;
  border: none;
}
.no-data-board {
@@ -789,125 +1432,183 @@
  align-items: center;
  height: 100%;
  width: 100%;
  background: #f8f9fa;
}
.metrics {
  display: flex;
  justify-content: space-between;
  margin-top: 15px;
}
.metric-item {
  text-align: center;
  flex: 1;
  padding: 10px;
}
.metric-name {
  font-size: 24px;
  color: #666;
  margin-bottom: 8px;
}
.metric-value {
  font-size: 22px;
  font-weight: bold;
  margin: 20px 0;
  color: #333;
}
/* å›¾è¡¨å¡ç‰‡æ ·å¼ */
.charts-section {
  margin-bottom: 20px;
  margin-bottom: 24px;
}
.chart-container {
  background: white;
  padding: 16px;
  border-radius: 8px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
.chart-card {
  background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);
  border-radius: 16px;
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
  border: 1px solid rgba(255, 255, 255, 0.8);
  overflow: hidden;
  height: 400px;
  display: flex;
  flex-direction: column;
}
  .title {
.chart-header {
  padding: 20px 24px 0;
  background: transparent;
}
.chart-title {
    display: flex;
    align-items: center;
  margin: 0 0 8px 0;
  font-size: 16px;
  font-weight: 600;
  color: #303133;
}
    &::before {
      display: block;
      content: "";
      width: 6px;
      height: 20px;
      background-color: #409eff;
      margin-right: 10px;
.chart-icon {
  margin-right: 8px;
  color: #409eff;
  font-size: 18px;
    }
.chart-subtitle {
  font-size: 13px;
  color: #909399;
  margin: 0;
  }
.chart-content {
  flex: 1;
  padding: 0 12px 20px;
  position: relative;
}
.chart {
  height: 350px;
  height: 100%;
  width: 100%;
}
.chart1 {
  height: 350px;
.chart-large {
  height: 100%;
  width: 100%;
}
.loading,
.error,
.no-data {
  margin-top: 50px;
  height: 500px;
  font-size: 20px;
}
.loading {
  color: #999;
}
.error {
  color: #f56c6c;
}
.metric-icon {
  width: 28px;
  height: 28px;
  border-radius: 8px;
.chart-loading,
.chart-error,
.chart-no-data {
  display: flex;
  align-items: center;
  flex-direction: column;
  justify-content: center;
  margin-right: 12px;
  margin-bottom: 6px;
  font-size: 24px;
  background: rgba(255, 255, 255, 0.8);
  align-items: center;
  height: 100%;
  color: #909399;
  font-size: 14px;
}
.no-data {
  color: #909399;
.chart-loading i,
.chart-error i,
.chart-no-data i {
  font-size: 48px;
  margin-bottom: 16px;
  opacity: 0.6;
}
.chart-loading {
  color: #409eff;
}
.chart-error {
  color: #f56c6c;
}
/* Element Plus æ ‡ç­¾æ ·å¼è°ƒæ•´ */
:deep(.el-tag) {
  border: none;
  font-size: 12px;
  font-weight: 500;
}
:deep(.el-tag--success) {
  background-color: #f0f9ff;
  background: linear-gradient(135deg, #f0f9ff, #e1f3ff);
  color: #67c23a;
}
:deep(.el-tag--primary) {
  background-color: #f0f9ff;
  background: linear-gradient(135deg, #f0f9ff, #e1f3ff);
  color: #409eff;
}
:deep(.el-tag--info) {
  background-color: #f4f4f5;
  background: linear-gradient(135deg, #f4f4f5, #e9e9eb);
  color: #909399;
}
:deep(.el-tag--warning) {
  background: linear-gradient(135deg, #fdf6ec, #faecd8);
  color: #e6a23c;
}
:deep(.el-tag--danger) {
  background-color: #fef0f0;
  background: linear-gradient(135deg, #fef0f0, #fde2e2);
  color: #f56c6c;
}
/* å“åº”式设计 */
@media (max-width: 1200px) {
  .metrics-grid {
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 16px;
  }
  .metric-card {
    padding: 20px;
  }
  .metric-value {
    font-size: 24px;
  }
}
@media (max-width: 768px) {
  .dashboard-container {
    padding: 16px;
  }
  .overview-header {
    flex-direction: column;
    gap: 16px;
  }
  .header-right {
    align-items: flex-start;
  }
  .metrics-grid {
    grid-template-columns: 1fr;
    gap: 12px;
  }
  .chart-card {
    height: 350px;
  }
}
/* æ»šåŠ¨æ¡æ ·å¼ä¼˜åŒ– */
.scroll-table-container::-webkit-scrollbar {
  width: 6px;
}
.scroll-table-container::-webkit-scrollbar-track {
  background: #f1f1f1;
  border-radius: 3px;
}
.scroll-table-container::-webkit-scrollbar-thumb {
  background: #c1c1c1;
  border-radius: 3px;
}
.scroll-table-container::-webkit-scrollbar-thumb:hover {
  background: #a8a8a8;
}
</style>
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db
Binary files differ
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db-shm
Binary files differ
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db-wal
Binary files differ
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db
Binary files differ
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db-shm
Binary files differ
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db-wal
Binary files differ
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/DocumentLayout.backup.json
@@ -3,36 +3,16 @@
  "WorkspaceRootPath": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{9912BD12-4CF7-4A91-8203-47C9C125004C}|WIDESEA_StorageTaskServices\\WIDESEA_StorageTaskServices.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_storagetaskservices\\task\\dt_taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9912BD12-4CF7-4A91-8203-47C9C125004C}|WIDESEA_StorageTaskServices\\WIDESEA_StorageTaskServices.csproj|solutionrelative:widesea_storagetaskservices\\task\\dt_taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}|WIDESEA_StorageBasicServices\\WIDESEA_StorageBasicServices.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_storagebasicservices\\stock\\stockinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}|WIDESEA_StorageBasicServices\\WIDESEA_StorageBasicServices.csproj|solutionrelative:widesea_storagebasicservices\\stock\\stockinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{111BD7AA-9749-4506-9772-79F9EF14754C}|WIDESEA_Core\\WIDESEA_Core.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_core\\enums\\enumhelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{111BD7AA-9749-4506-9772-79F9EF14754C}|WIDESEA_Core\\WIDESEA_Core.csproj|solutionrelative:widesea_core\\enums\\enumhelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}|WIDESEA_IStorageTaskService\\WIDESEA_IStorageTaskServices.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_istoragetaskservice\\task\\idt_taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}|WIDESEA_IStorageTaskService\\WIDESEA_IStorageTaskServices.csproj|solutionrelative:widesea_istoragetaskservice\\task\\idt_taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_wmsserver\\controllers\\basic\\stockinfocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\controllers\\basic\\stockinfocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{B8B1C352-0398-4A54-B202-D774D48367EB}|WIDESEA_IStorageBasicService\\WIDESEA_IStorageBasicServices.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_istoragebasicservice\\stock\\istockinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{B8B1C352-0398-4A54-B202-D774D48367EB}|WIDESEA_IStorageBasicService\\WIDESEA_IStorageBasicServices.csproj|solutionrelative:widesea_istoragebasicservice\\stock\\istockinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{929DF936-042C-4EEC-8722-A831FC2F0AEA}|WIDESEA_DTO\\WIDESEA_DTO.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_dto\\basic\\stockdatadto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{929DF936-042C-4EEC-8722-A831FC2F0AEA}|WIDESEA_DTO\\WIDESEA_DTO.csproj|solutionrelative:widesea_dto\\basic\\stockdatadto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_wmsserver\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
      "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{9912BD12-4CF7-4A91-8203-47C9C125004C}|WIDESEA_StorageTaskServices\\WIDESEA_StorageTaskServices.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_storagetaskservices\\task\\dt_taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9912BD12-4CF7-4A91-8203-47C9C125004C}|WIDESEA_StorageTaskServices\\WIDESEA_StorageTaskServices.csproj|solutionrelative:widesea_storagetaskservices\\task\\dt_taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -42,74 +22,11 @@
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 7,
          "SelectedChildIndex": 1,
          "Children": [
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "EnumHelper.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_Core\\Enums\\EnumHelper.cs",
              "RelativeDocumentMoniker": "WIDESEA_Core\\Enums\\EnumHelper.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_Core\\Enums\\EnumHelper.cs",
              "RelativeToolTip": "WIDESEA_Core\\Enums\\EnumHelper.cs",
              "ViewState": "AgIAABkAAAAAAAAAAAAAwAUAAAAiAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-14T01:01:56.246Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "Title": "StockInfoController.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Controllers\\Basic\\StockInfoController.cs",
              "RelativeDocumentMoniker": "WIDESEA_WMSServer\\Controllers\\Basic\\StockInfoController.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Controllers\\Basic\\StockInfoController.cs",
              "RelativeToolTip": "WIDESEA_WMSServer\\Controllers\\Basic\\StockInfoController.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAVAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-13T07:33:03.01Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 5,
              "Title": "IStockInfoService.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_IStorageBasicService\\Stock\\IStockInfoService.cs",
              "RelativeDocumentMoniker": "WIDESEA_IStorageBasicService\\Stock\\IStockInfoService.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_IStorageBasicService\\Stock\\IStockInfoService.cs",
              "RelativeToolTip": "WIDESEA_IStorageBasicService\\Stock\\IStockInfoService.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvxUAAAAsAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-13T07:32:46.496Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "Title": "StockDataDTO.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_DTO\\Basic\\StockDataDTO.cs",
              "RelativeDocumentMoniker": "WIDESEA_DTO\\Basic\\StockDataDTO.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_DTO\\Basic\\StockDataDTO.cs",
              "RelativeToolTip": "WIDESEA_DTO\\Basic\\StockDataDTO.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAdAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-13T06:32:51.624Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "IDt_TaskService.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_IStorageTaskService\\Task\\IDt_TaskService.cs",
              "RelativeDocumentMoniker": "WIDESEA_IStorageTaskService\\Task\\IDt_TaskService.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_IStorageTaskService\\Task\\IDt_TaskService.cs",
              "RelativeToolTip": "WIDESEA_IStorageTaskService\\Task\\IDt_TaskService.cs",
              "ViewState": "AgIAACAAAAAAAAAAAAD4vzEAAAAlAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-13T00:58:35.278Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 7,
              "DocumentIndex": 1,
              "Title": "appsettings.json",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\appsettings.json",
              "RelativeDocumentMoniker": "WIDESEA_WMSServer\\appsettings.json",
@@ -121,29 +38,28 @@
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "DocumentIndex": 0,
              "Title": "StockInfoService.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_StorageBasicServices\\Stock\\StockInfoService.cs",
              "RelativeDocumentMoniker": "WIDESEA_StorageBasicServices\\Stock\\StockInfoService.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_StorageBasicServices\\Stock\\StockInfoService.cs",
              "RelativeToolTip": "WIDESEA_StorageBasicServices\\Stock\\StockInfoService.cs",
              "ViewState": "AgIAAOkAAAAAAAAAAAAAwMIBAAAmAAAAAAAAAA==",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAALkBAAAEAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-09T04:49:28.39Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "DocumentIndex": 2,
              "Title": "Dt_TaskService.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_StorageTaskServices\\Task\\Dt_TaskService.cs",
              "RelativeDocumentMoniker": "WIDESEA_StorageTaskServices\\Task\\Dt_TaskService.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_StorageTaskServices\\Task\\Dt_TaskService.cs",
              "RelativeToolTip": "WIDESEA_StorageTaskServices\\Task\\Dt_TaskService.cs",
              "ViewState": "AgIAAGQCAAAAAAAAAAAswMgCAABhAAAAAAAAAA==",
              "ViewState": "AgIAAA0DAAAAAAAAAAAAAEsDAAAtAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-09T03:32:47.726Z",
              "EditorCaption": ""
              "WhenOpened": "2025-11-09T03:32:47.726Z"
            }
          ]
        }
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/DocumentLayout.json
@@ -7,28 +7,12 @@
      "RelativeMoniker": "D:0:0:{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}|WIDESEA_StorageBasicServices\\WIDESEA_StorageBasicServices.csproj|solutionrelative:widesea_storagebasicservices\\stock\\stockinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{9912BD12-4CF7-4A91-8203-47C9C125004C}|WIDESEA_StorageTaskServices\\WIDESEA_StorageTaskServices.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_storagetaskservices\\task\\dt_taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9912BD12-4CF7-4A91-8203-47C9C125004C}|WIDESEA_StorageTaskServices\\WIDESEA_StorageTaskServices.csproj|solutionrelative:widesea_storagetaskservices\\task\\dt_taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}|WIDESEA_IStorageTaskService\\WIDESEA_IStorageTaskServices.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_istoragetaskservice\\task\\idt_taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}|WIDESEA_IStorageTaskService\\WIDESEA_IStorageTaskServices.csproj|solutionrelative:widesea_istoragetaskservice\\task\\idt_taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_wmsserver\\controllers\\basic\\stockinfocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\controllers\\basic\\stockinfocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{B8B1C352-0398-4A54-B202-D774D48367EB}|WIDESEA_IStorageBasicService\\WIDESEA_IStorageBasicServices.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_istoragebasicservice\\stock\\istockinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{B8B1C352-0398-4A54-B202-D774D48367EB}|WIDESEA_IStorageBasicService\\WIDESEA_IStorageBasicServices.csproj|solutionrelative:widesea_istoragebasicservice\\stock\\istockinfoservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{929DF936-042C-4EEC-8722-A831FC2F0AEA}|WIDESEA_DTO\\WIDESEA_DTO.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_dto\\basic\\stockdatadto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{929DF936-042C-4EEC-8722-A831FC2F0AEA}|WIDESEA_DTO\\WIDESEA_DTO.csproj|solutionrelative:widesea_dto\\basic\\stockdatadto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_wmsserver\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
      "RelativeMoniker": "D:0:0:{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}|WIDESEA_WMSServer\\WIDESEA_WMSServer.csproj|solutionrelative:widesea_wmsserver\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{9912BD12-4CF7-4A91-8203-47C9C125004C}|WIDESEA_StorageTaskServices\\WIDESEA_StorageTaskServices.csproj|e:\\get\\duiduojiliku\\\u9879\u76EE\u4EE3\u7801\\wms\\widesea_wmsserver\\widesea_storagetaskservices\\task\\dt_taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{9912BD12-4CF7-4A91-8203-47C9C125004C}|WIDESEA_StorageTaskServices\\WIDESEA_StorageTaskServices.csproj|solutionrelative:widesea_storagetaskservices\\task\\dt_taskservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
@@ -38,61 +22,11 @@
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 5,
          "SelectedChildIndex": 1,
          "Children": [
            {
              "$type": "Document",
              "DocumentIndex": 3,
              "Title": "StockInfoController.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Controllers\\Basic\\StockInfoController.cs",
              "RelativeDocumentMoniker": "WIDESEA_WMSServer\\Controllers\\Basic\\StockInfoController.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\Controllers\\Basic\\StockInfoController.cs",
              "RelativeToolTip": "WIDESEA_WMSServer\\Controllers\\Basic\\StockInfoController.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAVAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-13T07:33:03.01Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 4,
              "Title": "IStockInfoService.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_IStorageBasicService\\Stock\\IStockInfoService.cs",
              "RelativeDocumentMoniker": "WIDESEA_IStorageBasicService\\Stock\\IStockInfoService.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_IStorageBasicService\\Stock\\IStockInfoService.cs",
              "RelativeToolTip": "WIDESEA_IStorageBasicService\\Stock\\IStockInfoService.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAADwvxUAAAAsAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-13T07:32:46.496Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 5,
              "Title": "StockDataDTO.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_DTO\\Basic\\StockDataDTO.cs",
              "RelativeDocumentMoniker": "WIDESEA_DTO\\Basic\\StockDataDTO.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_DTO\\Basic\\StockDataDTO.cs",
              "RelativeToolTip": "WIDESEA_DTO\\Basic\\StockDataDTO.cs",
              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAdAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-13T06:32:51.624Z"
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "IDt_TaskService.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_IStorageTaskService\\Task\\IDt_TaskService.cs",
              "RelativeDocumentMoniker": "WIDESEA_IStorageTaskService\\Task\\IDt_TaskService.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_IStorageTaskService\\Task\\IDt_TaskService.cs",
              "RelativeToolTip": "WIDESEA_IStorageTaskService\\Task\\IDt_TaskService.cs",
              "ViewState": "AgIAACAAAAAAAAAAAAD4vzEAAAAlAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-13T00:58:35.278Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 6,
              "DocumentIndex": 1,
              "Title": "appsettings.json",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\appsettings.json",
              "RelativeDocumentMoniker": "WIDESEA_WMSServer\\appsettings.json",
@@ -110,14 +44,14 @@
              "RelativeDocumentMoniker": "WIDESEA_StorageBasicServices\\Stock\\StockInfoService.cs",
              "ToolTip": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_StorageBasicServices\\Stock\\StockInfoService.cs",
              "RelativeToolTip": "WIDESEA_StorageBasicServices\\Stock\\StockInfoService.cs",
              "ViewState": "AgIAAOkAAAAAAAAAAAAAwMMBAAAqAAAAAAAAAA==",
              "ViewState": "AgIAAOsBAAAAAAAAAAAowBoCAAA/AAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2025-11-09T04:49:28.39Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "DocumentIndex": 2,
              "Title": "Dt_TaskService.cs",
              "DocumentMoniker": "E:\\GET\\DuiDuoJiLiKu\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_StorageTaskServices\\Task\\Dt_TaskService.cs",
              "RelativeDocumentMoniker": "WIDESEA_StorageTaskServices\\Task\\Dt_TaskService.cs",
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicServices/Stock/StockInfoService.cs
@@ -457,17 +457,33 @@
            DateTime firstDayOfMonth = new DateTime(utcNow.Year, utcNow.Month, 1);
            DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddSeconds(-1);
            // è®¡ç®—上月时间范围
            DateTime firstDayOfLastMonth = new DateTime(utcNow.Year, utcNow.Month, 1).AddMonths(-1);
            DateTime lastDayOfLastMonth = firstDayOfLastMonth.AddMonths(1).AddSeconds(-1);
            // è®¡ç®—当天时间范围
            DateTime todayStart = utcNow.Date;
            DateTime todayEnd = todayStart.AddDays(1).AddTicks(-1);
            // è®¡ç®—昨日时间范围
            DateTime startOfPreviousDay = utcNow.AddDays(-1).Date;  // å‰ä¸€å¤©çš„ 00:00:00
            DateTime endOfPreviousDay = startOfPreviousDay.AddDays(1).AddSeconds(-1);
            // æŸ¥è¯¢å½“月数据
            var currentMonthInStocks = stocks.Where(x => x.CreateDate >= firstDayOfMonth && x.CreateDate <= lastDayOfMonth).Sum(x => x.Quantity);
            var currentMonthOutStocks = orderdetail.Where(x => x.CreateDate >= firstDayOfMonth && x.CreateDate <= lastDayOfMonth).Sum(x => x.OutboundQuantity);
            // æŸ¥è¯¢å½“日数据
            //查询上月数据
            var currentMonthInStocksLastMonth = stocks.Where(x => x.CreateDate >= firstDayOfLastMonth && x.CreateDate <= lastDayOfLastMonth).Sum(x => x.Quantity);
            var currentMonthOutStocksLastMonth = orderdetail.Where(x => x.CreateDate >= firstDayOfLastMonth && x.CreateDate <= lastDayOfLastMonth).Sum(x => x.OutboundQuantity);
            // æŸ¥è¯¢ä»Šæ—¥æ•°æ®
            var currentDayInStocks = stocks.Where(x => x.CreateDate >= todayStart && x.CreateDate <= todayEnd).Sum(x => x.Quantity);
            var currentDayOutStocks = orderdetail.Where(x => x.CreateDate >= todayStart && x.CreateDate <= todayEnd).Sum(x => x.OutboundQuantity);
            // æŸ¥è¯¢æ˜¨å¤©æ—¥æ•°æ®
            var currentDayInStocksLast = stocks.Where(x => x.CreateDate >= startOfPreviousDay && x.CreateDate <= endOfPreviousDay).Sum(x => x.Quantity);
            var currentDayOutStocksLast = orderdetail.Where(x => x.CreateDate >= startOfPreviousDay && x.CreateDate <= endOfPreviousDay).Sum(x => x.OutboundQuantity);
            // ç”Ÿæˆæœ€è¿‘7天的出入库数据
            var last7Days = Enumerable.Range(0, 7)
@@ -483,7 +499,7 @@
            var inboundData = last7Days.Select(date => new
            {
                Date = date.ToString("MM-dd"),
                Value = stocks.Where(x => x.CreateDate.Date == date).Sum(x => x.Quantity)
                Value = stocks.Where(x => x.CreateDate.Date == date).Sum(x => x.Quantity),
            }).ToList();
            var outboundData = last7Days.Select(date => new
@@ -504,19 +520,23 @@
                metrics = new List<object>{
                new {
                    name = "今日进库量",
                    value = currentDayInStocks
                    value = currentDayInStocks,
                    compare =currentDayInStocks-currentDayInStocksLast,
                },
                new {
                    name = "今日出库量",
                    value = currentDayOutStocks
                    value = currentDayOutStocks,
                    compare =currentDayOutStocks-currentDayOutStocksLast,
                },
                new {
                    name = "本月进库量",
                    value = currentMonthInStocks
                    value = currentMonthInStocks,
                    compare =currentMonthInStocks-currentMonthInStocksLastMonth,
                },
                new {
                    name = "本月出库量",
                    value = currentMonthOutStocks
                    value = currentMonthOutStocks,
                    compare = currentMonthOutStocks - currentMonthOutStocksLastMonth,
                },
                new {
                    name = "库存总量",
@@ -558,6 +578,5 @@
            return content.Error("系统错误,请联系管理员");
        }
    }
    #endregion
}